比赛的时候比较暴力,就把所有情况讨论一下就好了。
在总数为偶数的情况下:
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也是纯暴力,先从起点从左到右遍历,再从第一行到最后一行走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;
}
暴力枚举答案,因为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;
}
先把大于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
*/