1. 程式人生 > >【ZOJ4067】Books(貪心)

【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