【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
null