题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5090
题目大意:有n个标号为1~n的盒子,每个盒子初始情况下有ai个珠子,每次操作可以加入0个或k的整数倍个珠子,问能否经过若干次操作使得标号为i的盒子里恰好有i个珠子。
关键思想:我们的策略是这样的,因为珠子只能增多不能减少,所以我们从珠子数为1开始,如果珠子数为1的盒子有x个,那我们只要留下1个,把其他x-1个盒子里的珠子变成1+k就行了。接着看珠子数为2的盒子,继续进行这个过程。其中若扫描到对应盒子数0,则一定无法实现,因为我们是按珠子数递增分析的。
另一种思路是二分匹配,珠子数x可以增加0个或k的整数倍,所以x和x,x+k,x+2k……(<=n)相连,建图完毕后可以用匈牙利算法求最大二分匹配。
代码如下:
#include <iostream> #include <cstdio> #include <string.h> using namespace std; int cnt[220]; int main(){ int T,N,K,x,flag; scanf("%d",&T); while(T--){ memset(cnt,0,sizeof(cnt)); flag=true; scanf("%d%d",&N,&K); for(int i=1;i<=N;i++){ scanf("%d",&x); cnt[x]++; } for(int i=1;i<=N;i++){ if(!cnt[i]){ printf("Tom\n"); flag=false; break; } cnt[i+K]+=cnt[i]-1; } if(flag)printf("Jerry\n"); } return 0; }