A
很简单的一个模拟,只要前面的数字有两个以上就能合成后面的,我们进行一遍合成看能不能出现2048就可以了。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e2+5;
int a[40];
int n;int deal(int x)
{int ret=0;while(x/2){ret++;x/=2;}return ret;
}int main()
{int T,tmp;scanf("%d",&T);while(T--){memset(a,0,sizeof(a));scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&tmp);a[deal(tmp)]++;}for(int i=1;i<=11;i++){a[i]+=a[i-1]/2;}if(a[11]>0){printf("YES\n");}else{printf("NO\n");}}return 0;
}
B
要在棋盘上放上两种马,让他们能够相互攻击的数目最大,问如何放。
当时做的时候想的是先DFS一遍,然后对剩下的再进行DFS,然后过了,就没有多想。刚才发现只要错开排列就可以。
#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<iostream>#include<cmath>#include<climits>#include<queue>#include<vector>#include<set>#include<map>using namespace std;typedef long long ll;const int INF=0x3f3f3f3f;const int MAXN=1e2+5;int mp[MAXN][MAXN];int n;const int drc[8][2]={1,2,1,-2,2,1,2,-1,-1,2,-1,-2,-2,1,-2,-1};void dfs(int x,int y,int cur){int u,v;if(mp[x][y]) return;int tmp=(cur==1)?2:1;mp[x][y]=tmp;for(int i=0;i<8;i++){u=x+drc[i][0]; v=y+drc[i][1];if(u<1||u>n || v<1||v>n) continue;dfs(u,v,tmp);}}int main(){while(~scanf("%d",&n)){memset(mp,0,sizeof(mp));for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(!mp[i][j]){dfs(i,j,2);}}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%c",mp[i][j]==1?'W':'B');}printf("\n");}}return 0;}
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=105;int n;int main()
{int cmd=0;while(~scanf("%d",&n)){for(int i=0;i<n;i++){cmd=i%2;for(int j=0;j<n;j++){printf("%c",cmd==0?'W':'B');cmd=!cmd;}printf("\n");}}return 0;
}
C
首先我们分析最多能组多少对,最多能组肯定是所有的人每三个人一组,但是我们还有其他限制要求,如果满足要求的人比最多能够组成的队还多显然所有的队都能组成。如果满足要求的人没有最多组成的队的人数多就是满足要求的组数。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;
int a,b,c,s;
int ans1,ans2;
int ans;int main()
{int T;scanf("%d",&T);while(T--){scanf("%d%d%d",&a,&b,&c);s=(a+b+c)/3;ans1=min(a,b);if(ans1>=s){ans=s;}else{ans=ans1;}printf("%d\n",ans);}return 0;
}