Hdu 5090 Game with Pearls(二分匹配)

来源:互联网 发布:阿里云注销备案 编辑:程序博客网 时间:2024/06/08 07:01

点击打开链接

Game with Pearls

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


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

题意:n个数,现在可以分别将每个数,加上k的整数倍或0。问最后是否能将n个数,改变成1到n的排列。

题解:如果一个数x能加上k的整数倍或0变成y,则在x和y之间建一条边。建完图跑最大匹配,如果最大匹配为n则有解。

代码如下:

#include<stdio.h>#include<iostream>#include<algorithm>#include<stack>#include<vector>#include<queue>#include<string.h>#define inff 0x3fffffff#define nn 110using namespace std;int n,k;int a[nn];struct node{    int st,en,next;}E[nn*nn];int p[nn],num;void init(){    memset(p,-1,sizeof(p));    num=0;}void add(int st,int en){    E[num].en=en;    E[num].next=p[st];    p[st]=num++;}int pre[nn];bool vis[nn];bool dfs(int id){    int i,w;    for(i=p[id];i+1;i=E[i].next)    {        w=E[i].en;        if(!vis[w])        {            vis[w]=true;            if(pre[w]==-1||dfs(pre[w]))            {                pre[w]=id;                return true;            }        }    }    return false;}void solve(){    int i;    int re=0;    memset(pre,-1,sizeof(pre));    for(i=1;i<=n;i++)    {        memset(vis,false,sizeof(vis));        if(dfs(i))            re++;    }    if(re==n)        puts("Jerry");    else        puts("Tom");}int main(){    int t,i,j;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&k);        for(i=1;i<=n;i++)            scanf("%d",&a[i]);        init();        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)            {                if((j-a[i])>=0&&(j-a[i])%k==0)                {                    add(i,j);                }            }        }        solve();    }    return 0;}


0 0
原创粉丝点击