码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #648 (Div. 2)

时间:2020-06-13 13:04:17      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:判断   lock   int   else   can   数据   不同类   破坏   构造   

Codeforces Round #648 (Div. 2)

A.

题意:

玩搞矩阵的游戏,只能在同行和同列都是0的地方把这个位置的0变成1,谁没法继续变了谁就输了

tag:

贪心,模拟

题解:

没有什么麻烦的贪心策略,1的行和列设为false,从头到尾跑一遍,i行j列是不是还可以放,因为无后效性(灵活运用词语哈哈),所以顺序跑就好了,很简单~

C++(AC):

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int x,ans=0,t,n,m;
	bool h[100],l[100];
	cin>>t;
	while (t--)
	{
		ans=0;
		cin>>n>>m;
		for (int i=1;i<=n;i++)
		  h[i]=0;
		for (int j=1;j<=m;j++)
		  l[j]=0;
		for (int i=1;i<=n;i++)
		  for (int j=1;j<=m;j++)
		  {
		    scanf("%d",&x);
		    if (x==1)
		    {
		      h[i]=1;
		      l[j]=1;
		    }
		  }    
		for (int i=1;i<=n;i++)
	  	  for (int j=1;j<=m;j++)
	    	if (!h[i] and !l[j])
	    	{
	    		h[i]=1;
	    		l[j]=1;
	    		ans++;
	    	}
		if (ans%2==0)
	  		cout<<"Vivek"<<endl;
		else
	  		cout<<"Ashish"<<endl;
    }
   return 0;
}

B.

题意:

从小到大排序过程中麻烦了一下,每个数字底下有一个它的类别(0或者1),不同类别的才能换,判断给定的数字可不可以成功按升序排好

tag:

构造算法,模拟

题解:

既然是判断YES或NO,就没有必要全部表示出来,只要有一个不一样的类型,就都可以通过它来完成所有的交换:

20 10 100 50
0 1 0 0
20 50 100 10
0 0 0 1
20 50 10 100
0 0 1 0
20 10 50 100
0 1 0 0

所以判断有没有不同类型,没有的话看原来是不是升序就好了

愚蠢的我:

在插入排序、快速排序、冒泡排序里加上判断类型是否一样的判断条件,结果都破坏了原有的算法性质,和这些排序直接不一样

C++(补题):

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int n,t,a[1000],b[10],x;
	cin>>t;
	while (t--)
	{
		bool pd=false;
		cin>>n;
		b[0]=b[1]=0;
		for (int i=1;i<=n;i++)
		  scanf("%d",&a[i]);
		for (int i=1;i<=n;i++)
		{
			scanf("%d",&x);
			b[x]++;
		}
		if (b[0]!=0 and b[1]!=0)
			cout<<"Yes"<<endl;
		else
		{
		  for (int i=1;i<=n-1;i++)
		    if (a[i]>a[i+1])
		    {
		    	pd=true;
		    	cout<<"No"<<endl;
		    	break;
		    }
		  if (pd==false)
		    cout<<"Yes"<<endl;
		}
	}
	return 0;
}

C.

题意:

输入一个打乱顺序(当然也可以不乱)的1-n的序列,计算不断把第一个数移到最后的过程中,与待匹配序列的最多的一对一相等元素的数量

tag:

构造算法,数据结构,贪心,模拟

题解:

统计每个数字的原始位置和靶的位置,减一下,统计移动次数相同的,移动步数相同的最多的即是答案。虽然C++跑不了那么大的数组(我也不知为什么),但是算算没超内存就行

愚蠢的我:

想用DP,找每个位置的最多的从头到尾搞。。。其实用简单的算法就可以搞定

C++(补题):

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int n,a[200010],b[200010],num[200010],c[200010],x,maxx=0;
	cin>>n;
	for (int i=1;i<=n;i++)
	{
	  scanf("%d",&x);
	  num[i]=0;
	  a[x]=i;
    }  
	for (int i=1;i<=n;i++)
	{
	  scanf("%d",&x);
	  b[x]=i;
    }
	for (int i=1;i<=n;i++)
	{
		c[i]=b[i]-a[i];
		if (c[i]<0)
		  c[i]=n+c[i];
	}
	for (int i=1;i<=n;i++)
		num[c[i]]++;
	for (int i=0;i<=n;i++)
	  maxx=max(maxx,num[i]);
	cout<<maxx;
	return 0;
}

Codeforces Round #648 (Div. 2)

标签:判断   lock   int   else   can   数据   不同类   破坏   构造   

原文地址:https://www.cnblogs.com/IamIron-Man/p/13113430.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!