年龄巧合
暴力枚举每一个数字判断(注意题目上有两个人,找的是年龄大点的)
#include <iostream>
using namespace std;
int main()
{
int st=0;
for(int i=2014;;i--) {
int age=2014-i;
int year=i,cnt=0;
while(year) {
cnt+=year%10;
year/=10;
}
if(age==cnt) {
if(!st) st++;
else {
cout<<i<<endl;
break;
}
}
}
return 0;
}
纸牌三角形
枚举全排列,然后进行判断。注意会有重复的情况,所以要除以重复数字6。那么为什么是6呢?九个数字围城一个环,按理说就会有九种方法切割,但是由于这道题边的性质所以角上的点对于每一种方案都是固定的,就只有不在角上的六个点
#include<iostream>
using namespace std;
const int N = 15;
int q[N], st[N];
int idx, ans;
void dfs(int k) {
if (k == 9) {
int sum1 = q[0] + q[1] + q[2] + q[3];
int sum2 = q[3] + q[4] + q[5] + q[6];
int sum3 = q[6] + q[7] + q[8] + q[0];
if (sum1 == sum2 && sum2 == sum3) ans++;
return;
}
for (int i = 1; i <= 9; i++) {
if (!st[i]) {
st[i] = 1;
q[idx++] = i;
dfs(k + 1);
idx--;
st[i] = 0;
}
}
}
int main() {
dfs(0);
cout << ans / 6 << endl;
return 0;
}
取球游戏
先来想一下什么是必胜状态什么是必败状态(都是对于先手说的)?必胜状态就是说总有办法让对方达到必败的状态,必败状态就是说没有办法让对手达到必败状态。所以就可以判断每一种先手可以采取的策略,只要有一种能使对手达到必败局面就一定可以获胜,否则必败
#include <iostream>
#include <cstring>
using namespace std;
const int N=1e4+10;
int num[N];
int find(int k) {
if(num[k]!=-1) return num[k];
if(k>=1&&find(k-1)==0) num[k]=1;
if(k>=3&&find(k-3)==0) num[k]=1;
if(k>=7&&find(k-7)==0) num[k]=1;
if(k>=8&&find(k-8)==0) num[k]=1;
//0必败1必胜,如果采取某一种方案能使对手达到必败局面,那么必胜
if(num[k]==-1) num[k]=0;
return num[k];
}
int main()
{
memset(num,-1,sizeof(num));
num[0]=1;
int t;
cin>>t;
while(t--) {
int n;
cin>>n;
cout<<find(n)<<endl;
}
return 0;
}