码迷,mamicode.com
首页 > 其他好文 > 详细

[HDU 5090] Game with Pearls (贪心)

时间:2014-11-28 22:38:41      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

题目链接: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 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <map>
 7 #include <set>
 8 #include <queue>
 9 #include <string>
10 #include <functional>
11 using namespace std;
12 
13 int vis[110];
14 int a[110];
15 int N,K;
16 bool flag;
17 
18 int main(){
19     int M;
20     scanf("%d",&M);
21 
22     while(M--){
23         flag = true;
24         memset(vis,0,sizeof(vis));
25         scanf("%d%d",&N,&K);
26         for(int i=0;i<N;i++){
27             scanf("%d",&a[i]);
28         }
29         sort(a,a+N,greater<int>() );
30         int i;
31         for(i=N;i>=1;i--){
32             for(int j=0;j<N;j++){
33                 if( a[j]<=i&&!vis[j]&&(i-a[j])%K==0 ){
34                     vis[j]=1;
35                     break;
36                 }
37             }
38         }
39         for(int i=0;i<N;i++){
40             if( !vis[i] ) {
41                 flag = 0;
42                 break;
43             }
44         }
45         if(flag) puts("Jerry");
46         else puts("Tom");
47     }
48     return 0;
49 }
50 
51 /*
52 10
53 3 1
54 1 2 3
55 3 1
56 0 0 0
57 3 2
58 2 2 3
59 3 2
60 0 1 3
61 5 1
62 1 2 3 4 5
63 6 2
64 1 2 3 4 5 5
65 */

 

[HDU 5090] Game with Pearls (贪心)

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/llkpersonal/p/4129457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!