hdu 5090 Game with Pearls(最大匹配)

来源:互联网 发布:雪纺衫淘宝好评 编辑:程序博客网 时间:2024/06/09 20:57

Game with Pearls

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1914    Accepted Submission(s): 671


Problem Description
Tom and Jerry are playing a game with tubes and pearls. The rule of the game is:

1) Tom and Jerry come up together with a number K.

2) Tom provides N tubes. Within each tube, there are several pearls. The number of pearls in each tube is at least 1 and at most N.

3) Jerry puts some more pearls into each tube. The number of pearls put into each tube has to be either 0 or a positive multiple of K. After that Jerry organizes these tubes in the order that the first tube has exact one pearl, the 2nd tube has exact 2 pearls, …, the Nth tube has exact N pearls.

4) If Jerry succeeds, he wins the game, otherwise Tom wins.

Write a program to determine who wins the game according to a given N, K and initial number of pearls in each tube. If Tom wins the game, output “Tom”, otherwise, output “Jerry”.
 

Input
The first line contains an integer M (M<=500), then M games follow. For each game, the first line contains 2 integers, N and K (1 <= N <= 100, 1 <= K <= N), and the second line contains N integers presenting the number of pearls in each tube.
 

Output
For each game, output a line containing either “Tom” or “Jerry”.
 

Sample Input
2 5 1 1 2 3 4 5 6 2 1 2 3 4 5 5
 

Sample Output
Jerry Tom
 

Source

2014上海全国邀请赛——题目重现(感谢上海大学提供题目)  

题意:Jerry 和 Tom 玩一个游戏 , 给你 n 个盒子 , a[ i ] 表示开始时 ,
第 i 个盒子中的小球的个数 。 然后 Jerry 可以在每个盒子里加入 0 或 k的倍数的小球 ,
  操作完后,Jerry 可以重新排列 盒子的顺序,最终使 第 i 个盒子中有 i 个小球。 若Jerry能
使最终的盒子变成那样,就输出 “Jerry” ,否则 输出 “Tom” 。
大神的解释:


只不过我写的和他的建图的方式不太一样,我是用了n+1到2*n来建图,这里只是想更容易懂所以附上大神解释原理是一样的。

这是大神解释的报告链接:点击打开链接

刚开始只是一个劲的模拟,但是水平太次没有模拟出来,看了别人的思路才知道可以用最大匹配
还是做题太少啊,

#include<stdio.h>#include<string.h>#define M 1100int path[M][M],vis[M],used[M];int n,k;int dfs(int x){for(int i=n+1;i<=n*2;i++){if(!vis[i] && path[x][i]){vis[i]=1;if(used[i]==-1 || dfs(used[i])){used[i]=x;return 1;}}}return 0;}int main(){int t,i,j,a;scanf("%d",&t);while(t--){scanf("%d%d",&n,&k);memset(path,0,sizeof(path));for(i=1;i<=n;i++){scanf("%d",&a);for(j=a;j<=n;j+=k){path[i][j+n]=1;//把这个点多能加到的点都与这个点相连一条边 path[j+n][i]=1;}}int ans=0;memset(used,-1,sizeof(used));for(i=1;i<=n;i++){memset(vis,0,sizeof(vis));ans+=dfs(i);}if(ans==n) printf("Jerry\n");else printf("Tom\n");}return 0;}


0 0
原创粉丝点击