A. Boboniu Likes to Color Balls
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
int num=0;
if(a&1) num++;
if(b&1) num++;
if(c&1) num++;
if(d&1) num++;
if(num==1||num==0) cout<<"Yes"<<'\n';
else if(a>0&&b>0&&c>0)
{
int nu=0;
a--,b--,c--;d+=3;
if(a&1) nu++;
if(b&1) nu++;
if(c&1) nu++;
if(d&1) nu++;
if(nu==1||nu==0) cout<<"Yes"<<'\n';
else cout<<"No"<<'\n';
}else cout<<"No"<<'\n';
}
return 0;
}
B. Boboniu Plays Chess
#include<bits/stdc++.h>
using namespace std;
const int N=200;
int d[N][N];
int main()
{
int n,m,x,y;
cin>>n>>m>>x>>y;
while(x>=1)
{
cout<<x<<" "<<y<<endl;
d[x][y]=1;
x--;
}
x++;
while(y>=1){
if(!d[x][y]) cout<<x<<" "<<y<<endl;
d[x][y]=1;
y--;
}
int i=1,j=1;
while(i<=n)
{
if(i&1)
{
j++;
while(j<=m)
{
if(!d[i][j]) cout<<i<<" "<<j<<endl;
d[i][j] = 1;
j++;
}
}else
{
j--;
while(j>=1)
{
if(!d[i][j]) cout<<i<<" "<<j<<endl;
d[i][j] = 1;
j--;
}
}
i++;
}
}
C. Boboniu and Bit Operations(DP+位运算)
思路:
dp(i,state) 表示当前构造前i个数后,结果状态为state是否存在;如果存在则根据第i+1个数来得出构造到i+1个数时结果的状态;
一共有n*m个状态,每个状态计算量为;则复杂度就是:n*m*
#include<bits/stdc++.h>
using namespace std;
const int N = 210,M=1<<10;
int a[N],b[N],dp[N][M];
int main()
{
int n,m;
cin >>n>>m;
for(int i=1;i<=n;i++) cin >>a[i];
for(int i=1;i<=m;i++) cin >>b[i];
dp[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int andd=a[i]&b[j];
for(int k=0;k<M;k++)
if (dp[i-1][k])
{
dp[i][k|andd]=1;
}
}
}
for(int i=0;i<M;i++)
{
if(dp[n][i])
{
cout <<i;
break ;
}
}
}
D. Boboniu Chats with Du(前缀和+枚举)
思路:
(眼瞎没看见序列可以重新排列) 贪心的思想为:先把大于m和小于等于m的区分开存放;假设当前有x个大于m的数,那么我们可以选择1~x个大于m的数,既然选了,肯定要选择最大的;假设我们选了y个,那么其中一个可以放在第n天,消耗1天;剩下的y-1个消耗 (y-1)*(d+1) ; 现在总共消耗 (y-1)*(d+1) +1天;剩下cnt = n-(y-1)*(d+1) +1天;这cnt天可以在小于m的数里面找,贪心找最大的前cnt个即可;
#include<bits/stdc++.h>
using namespace std;
const int N =2e5+10;
typedef long long ll;
ll a[N],b[N];
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int n,d,m;
cin >>n>>d>>m;
int x=0,y=0;
for(int i=1;i<=n;i++)
{
ll xx;
cin >>xx;
if(xx>m) a[++x]=xx;//闭嘴vc
else b[++y]=xx;
}
sort(a+1,a+1+x,cmp);
sort(b+1,b+1+y,cmp);
for(int i=1;i<=y;i++) b[i]+=b[i-1];
ll res=0,ans=b[y];
for(int i=1;i<=x;i++)
{
res+=a[i];
int pos=(i-1)*(d+1)+1;
if(pos>n) break;
pos=n-pos;
pos=min(pos,y);
ans=max(ans,res+b[pos]);
}
cout <<ans<<endl;
return 0;
}
比赛时py的code:
#include<bits/stdc++.h>
using namespace std;
const int N =2e5+10;
typedef long long ll;
ll a[N],s[N],f[N];
int n,d,m;
int main()
{
cin>>n>>d>>m;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
int ff=0,x=n+1;
for(int i=1;i<=n;i++)
{
if(m<a[i])
{
ff=1;
x=i;
reverse(a+1,a+x);
if(ff==1) break;
}
}
for(int i=1;i<=n;i++) s[i]+=s[i-1]+a[i];
for(int i=n;i>=1;i--) f[i]+=f[i+1]+a[i];
ll maxn=0;
int i=n;
for(int t=1;t<=n;)
{
int minn=min(n-t,x-1);
maxn=max(maxn,f[i]+s[minn]);
i--;
t=t+d+1;
}
cout<<maxn<<endl;
}