【ZOJ4067】Books(贪心)

题意:DG在书店买书,从左到右第i本书价格为ai

DG从左走到右,能买就买。如果已知DG买了m本书,问他原本最多有多少钱。

若无上限,输出“Richman”,若不可能买这么多书,输出“Impossible”。

1 ≤ n ≤ 105,0 ≤ m ≤ n,0 ≤ ai ≤ 109

思路:价格为0的书必买,若价格为0的数量>m则无解

m=n则可以有无限钱

剩余的情况m减去价格为0的数量,剩余的一定是前m-1个和后面所有的最小值-1之和

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<vector>
11 using namespace std;
12 typedef long long ll;
13 typedef unsigned int uint;
14 typedef unsigned long long ull;
15 typedef pair<int,int> PII;
16 typedef vector<int> VI;
17 #define fi first
18 #define se second 
19 #define MP make_pair
20 #define N      110000
21 #define M      51
22 #define MOD 1000000007
23 #define eps 1e-8 
24 #define pi     acos(-1)
25 #define oo     1010000000
26 
27 int a[N];
28 
29 int main()
30 { 
31      int cas;
32      scanf("%d",&cas);
33      for(int v=1;v<=cas;v++) 
34      {
35         int n,m;
36         scanf("%d%d",&n,&m);
37         int s=0;
38         for(int i=1;i<=n;i++) 
39         {
40             scanf("%d",&a[i]); 
41             if(!a[i]) s++;
42         }
43         if(s>m) 
44         {
45             printf("Impossible\n");
46             continue;
47         }
48         if(n==m)
49         {
50             printf("Richman\n");
51             continue;
52         }
53         m-=s;
54         ll ans=0;
55         int k=0;
56         if(m>0)
57         {
58             for(int i=1;i<=n;i++)
59             {
60                  if(a[i])
61                 {
62                      m--; ans+=a[i];
63                 }
64                 if(m==0){k=i; break;}
65             }
66         }
67         int mn=oo;
68         for(int i=k+1;i<=n;i++) 
69          if(a[i]) mn=min(mn,a[i]);
70         ans+=mn-1;
71         printf("%lld\n",ans);
72     }
73     return 0;
74 }
75     

 

posted on 2018-11-30 19:30  myx12345  阅读(254)  评论(0编辑  收藏  举报

导航