HDU 5099 [Game with Pearls] 最大匹配

题目链接: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;
}

 

    原文作者:哇咔咔咔
    原文地址: https://www.cnblogs.com/G-M-WuJieMatrix/p/7441678.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞