Codeforces Round #664 (Div. 2) A~D 思维+暴力

Codeforces Round #664 (Div. 2) A~D 思维+暴力

A - Boboniu Likes to Color Balls

比赛的时候比较暴力,就把所有情况讨论一下就好了。
在总数为偶数的情况下:
1、所有球都是奇数的,转换一次所有球就都是偶数了。
2、所有球都是偶数的,不用转换。
3、红蓝绿的球数量相同时,全部转为白就可以了。
总数为奇数的情况下:
1、红,绿,蓝,白其中有一个是奇数其他全是偶数,不用转换。
2、红,绿,蓝,白其中有一个是偶数其他全是奇数,转换一次就可以。
3、红蓝绿的球数量相同时,全部转为白就可以了。

#include
#include
#include
using namespace std;
#define ll long long
const int mod = 1e9+7;
const int maxn = 1e6+5;
vector<int> v[maxn],g[maxn];
int vis[maxn];
int main()
{
	int T=1;
	scanf("%d",&T);
	while(T--)
	{
		ll r,g,b,w;
		scanf("%lld %lld %lld %lld",&r,&g,&b,&w);
		ll sum = r+g+b+w;
		int minn = min(r,min(g,b));
		if(sum%2==0)
		{
			if(r%2==0&&g%2==0&&b%2==0&&w%2==0)
				puts("Yes");
			else if(r%2==1&&g%2==1&&b%2==1&&w%2==1)
				puts("Yes");
			else if(r==g&&g==b)
				puts("Yes");
			else
				puts("No");
		}
		else
		{
			if(r%2==1&&g%2==0&&b%2==0&&w%2==0)
				puts("Yes");
			else if(r%2==0&&g%2==1&&b%2==0&&w%2==0)
				puts("Yes");
			else if(r%2==0&&g%2==0&&b%2==1&&w%2==0)
				puts("Yes");
			else if(r%2==0&&g%2==0&&b%2==0&&w%2==1)
				puts("Yes");
			else if(r%2==1&&g%2==1&&b%2==0&&w%2==1&&minn>0)
				puts("Yes");
			else if(r%2==1&&g%2==0&&b%2==1&&w%2==1&&minn>0)
				puts("Yes");
			else if(r%2==0&&g%2==1&&b%2==1&&w%2==1&&minn>0)
				puts("Yes");
			else if(r%2==1&&g%2==1&&b%2==1&&w%2==0&&minn>0)
				puts("Yes");
			else if(r==g&&g==b)
				puts("Yes");
			else
				puts("No");
		}
	}
	return 0;
}

B - Boboniu Plays Chess

B也是纯暴力,先从起点从左到右遍历,再从第一行到最后一行走S型遍历。

#include
#include
#include
using namespace std;
#define ll long long
const int mod = 1e9+7;
const int maxn = 1e6+5;
vector<int> v[maxn],g[maxn];
int vis[maxn];
int main()
{
	int T=1;
//	scanf("%d",&T);
	while(T--)
	{
		int n,m,s,t;
		scanf("%d %d %d %d",&n,&m,&s,&t);
		int x=s,y=t;
		for(int i=0,cnt=1,tag=0;i<m;i++,cnt++)
		{
			printf("%d %d\n",x,y);
			if(y>1&&tag==0)
				y = t-cnt;
			else
				y = t+cnt;
			if(y==1)
			{
				cnt=0;
				tag=1;
			}
				
		}
		bool flag = 0;
		for(int i=1;i<=n;i++)
		{
			if(i==s) continue;
			for(int j=1;j<=m;j++)
			{
				if(flag)
					printf("%d %d\n",i,j);
				else
					printf("%d %d\n",i,m+1-j);
			}
			flag = !flag;
		}
	}
	return 0;
}

C - Boboniu and Bit Operations

暴力枚举答案,因为a,b范围都小于29所以答案一定小于210直接暴力枚举答案就好了。

#include
#include
#include
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
const int mod = 1e9+7;
const int maxn = 1e6+5;
int a[maxn],b[maxn],vis[10],pass[10];
vector<int> v[maxn];
struct node
{
	int val;
	int pos;
} p[maxn];
bool cmp(node x,node y)
{
	return x.val>y.val;
}
int main()
{
	int T=1;
//	scanf("%d",&T);
	while(T--)
	{
		int n,m;
		scanf("%d %d",&n,&m);
		for(int i=0; i<n; i++)
			scanf("%d",&a[i]);
		for(int i=0; i<m; i++)
			scanf("%d",&b[i]);
		for(int k=0;k<(1<<10);k++)
		{
			for(int i=0;i<n;i++)
			{
				int flag=false;
				for(int j=0;j<m;j++)
				{
					if((k|(a[i]&b[j]))==k)
					{
//						printf("k = %d,a = %d,b = %d\n",k,a[i],b[j]);
						flag = true;
						break;
					}
				}
				if(!flag)
					break;
				else if(i+1==n)
				{
					printf("%d\n",k);
					return 0; 
				}
			}
		}
	}
	return 0;
}

D - Boboniu Chats with Du

先把大于m的放在b数组,小于m的放在a数组

枚举一下最终结果中用了几个b,取一个最大值即可

#include
#include
#include
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
const int mod = 1e9+7;
const int maxn = 1e6+5;
ll a[maxn],b[maxn],sum1[maxn],sum2[maxn];
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int T=1;
//	scanf("%d",&T);
	while(T--)
	{
		int n,d,m,cnta=0,cntb=0;
		ll ans = 0;
		int big = 0;
		scanf("%d %d %d",&n,&d,&m);
 
		for(int i=0; i<n; i++)
		{
			ll num;
			scanf("%lld",&num);
			if(num>m)	b[cntb++] = num;
			else	a[cnta++] = num;
		}
		sort(a,a+cnta,cmp);
		sort(b,b+cntb,cmp);
		for(int i=0; i<cnta; i++)
		{
			if(i==0)	sum1[i]=a[i];
			else	sum1[i] = sum1[i-1]+a[i];
		}
		for(int i=0; i<cntb; i++)
		{
			if(i==0)	sum2[i]=b[i];
			else	sum2[i] = sum2[i-1]+b[i];
		}
		ans = sum1[cnta-1];
		for(int i=1; i<=cntb; i++)
		{
			ll p=1LL*(i-1)*d+i;
			if(p>n)continue;
			ll k=max(0ll,1ll*(i-1)*d-(cntb-i));
			ll tmp=sum2[i-1];
			tmp+=sum1[cnta-k-1];
			ans=max(ans,tmp);
		}
		printf("%lld\n",ans);
	}
	return 0;
}
/*
5 5 10
100 100 100 100 100
*/

你可能感兴趣的:(Codeforces,补题库,思维+暴力)