hdu 5090 Game with Pearls (额,, 想法题吧 / 二分图最大匹配也可做)

题意:

给你N个数,a1,,,,an。代表第i个管子里有ai个珍珠。

规定只能往每根管里增加k的倍数个珍珠。

如果存在一套操作,操作完毕后可以得到1~N的一个排列,则Jerry赢,否则Tom赢。

问谁赢。

思路:

将a1...an从小到大排序,可知道每根管里的数只能增不能减。将最后的1...N中的每个数一定是由小于等于它的数加上若干个K得到来的。

额..直接看代码吧

代码:

int a[1005];
int m,n,k;

int main(){
    //freopen("test.in","r",stdin);
    cin>>m;
    while(m--){
        scanf("%d%d",&n,&k);
        mem(a,0);
        rep(i,1,n){
            int x;
            scanf("%d",&x);
            a[x]+=1;
        }
        int win=1;
        a[k]+=(a[0]);
        rep(i,1,n){
            if(a[i]==0){
                win=0;
                break;
            }
            --a[i]; //消掉一根管
            if(a[i]!=0 && i+k<=n) a[i+k]+=(a[i]); //有a[i]个珍珠的管子的珍珠数都加K。
        }
        if(!win)
            puts("Tom");
        else
            puts("Jerry");
    }
    //fclose(stdin);
}
时间: 2024-10-22 19:43:05

hdu 5090 Game with Pearls (额,, 想法题吧 / 二分图最大匹配也可做)的相关文章

hdu 2444 The Accomodation of Students 判断时候构成二分图 + 最大匹配

此题就是求最大匹配.不过需要判断是否构成二分图.判断的方法是人选一点标记为红色(0),与它相邻的点标记为黑色(1),产生矛盾就无法构成二分图.声明一个vis[],初始化为-1.通过深搜,相邻的点不满足异或关系就结束.如果没被标记,就标记为相邻点的异或. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue>

hdu 5090 Game with Pearls 同余类

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5090 题目大意是有n个数 给一个k 每次你只能给其中一个数加上“k的非负整数倍的值”(包括0) 问最终能否让这堆数变成从1到n各有一个 简单排序完贪心是不对的 正确的思想是同余类 因为实质上每次只能加k,所以模k同余的可归为一类 然后分别对每一个同余类是否有可能合法 不合法的情形有两种 a.该同余类内的数不够多或太多 b.该同余类内的对应位置的数不够小 如果按这种想法走还需特判一下模k得0的情况 总

HDU 5090 Game with Pearls(二分匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5090 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, the

[HDU 5090] Game with Pearls (贪心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5090 题目大意:给你n个数,问你给若干个数增加c*k(c>=0)能否组成1,2,3,4,5,...,n? 今天下午作比赛的时候,我先用了个dfs,看这个a[i]匹配的是1到n的哪个数. 后来TLE到死... 仔细想想,首先,如果这个数是小的数的话,那么它可以匹配很多种,因此如果先将它匹配掉了会浪费,因为它“能力”大. 因此就可以排个序,从大到小进行匹配. 我也不知道怎么用数学语言去证明... 1 #

HDU 4193 Non-negative Partial Sums(想法题,单调队列)

HDU 4193 题意:给n个数字组成的序列(n <= 10^6),求该序列的循环同构序列中,有多少个序列的任意前i项和均大于或等于0. 思路: 这题看到数据规模觉得只能用最多O(nlogn)的算法,然后想到了之前刚做过的有关最小表示法的题,但还没证明出一个做这题有效的算法出来. 后来看过题解,发现用的最多的方法是单调队列,然而我对这个知识点知之甚少orz /*科普君:from单调队列 单调队列是指:队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队操作.

hdu 5090 Game with Pearls(最大匹配)

Game with Pearls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 196    Accepted Submission(s): 120 Problem Description Tom and Jerry are playing a game with tubes and pearls. The rule of the g

hdu 5386 Cover(暴力求解+想法题)

题意: 有两种操作: 操作L x y,把当前x,这一列全部置为y 操作H x y,把当前,这一行全部置为y. 现在给你n?n的初始矩阵,以及n?n的目标矩阵 现在给你m种操作(由以上两种操作构成),问怎么排序这m种操作,才能使得,初始矩阵,经由排序后的操作,构成目标矩阵. 输出排序方案. 解析: 逆向思维, 枚举每个操作,然后判断该操作是不是最后一个操作.(就像撕胶布一样,一条一条的剥离) 判断是否是最后一个操作方法就是: 除去已经用过的点,如果一排都等于当前操作的颜色,那就是最后一个操作.然后

HDU 5090 Game with Pearls

直接贪心就可以了,接收的时候把0都加上k,每次从最小的数开始找,如果有多个相同的,那么保留一个,其他的都加上k #include<stdio.h> #include<algorithm> using namespace std; int a[105]; int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int T,n,k; scanf("%d&q

hdu 5414 CRB and String(想法题)

题意: 给你两个字符串s和t,你可以在字符串s中任意选一个字符c,在该字符c后插入一个字符d(d!=c),问经过多次此操作,能否将字符串s转化成字符串t. 解析: 不要想太复杂了,分情况讨论清楚就好了. 1. 如果|s|>|t|,那么无论怎么组合都是无法构成t的. 2. 如果s[0]!=t[0],无论怎么组合,也都是无法构成t的. 3. 以上两种情况比较好考虑,然后找两个串的最长公共前缀. 如果s的最长公共前缀等于|t|则表明两个字符串完全相同,这种看情况可以构造出t,因为上面已经排除了|s|>