2018 青島區域賽 J - Books
阿新 • • 發佈:2018-12-04
Books
Sample Input
4
4 2
1 2 4 8
4 0
100 99 98 97
2 2
10000 10000
5 3
0 0 0 0 1
Sample Output
6
96
Richman
Impossible
題意描述:
給出n本書的價格和想要購買的書的數量m。購買書的規則為:每次按順序檢查每一本書,對於每一本正在檢查的書,如果有足夠的錢(不低於書價),將購買該書,錢數將減少該書的價格。如果錢數少於現在被檢查的書的價格,將跳過那本書。求出只能購買m本書的最大錢數。如果可以帶無限多的錢輸出“Richman”,如果不能實現只買m本書輸出“Impossible”。
解題思路:
有題意可知當n等於m是可以帶無限多的錢,其他情況先找出n本書中價格為0的本數。當價格為0的本數大於m時,則為不能實現只買m本書。當價格為0的本書小於等於m時,假設m減去價格為0的本書剩下k本,買下前k本價格不為0的書(因要求的結果是隻買m本書的最大錢數),找出剩下價格不為0的書中的價格最小的,輸出買下前k本價格不為0書的價格之和加上剩餘書中價格不為0的最低價格減一。
程式碼:
#include<stdio.h> # define inf 9999999999 int main() { long long a[100010],n,m,k,i,sum,t,ans,s,min; scanf("%lld",&t); while(t--) { ans=0; scanf("%lld%lld",&n,&m); for(i=1;i<=n;i++) { scanf("%lld",&a[i]); if(a[i]==0) ans++; } if(n==m) { printf("Richman\n"); continue; } else if(ans>m) { printf("Impossible\n"); continue; } k=m-ans; s=1; sum=0; min=inf; for(i=1;i<=n;i++) { if(a[i]==0) continue; if(s<=k) { sum+=a[i]; s++; } else if(s>k) { if(min>a[i]) min=a[i]; } } printf("%lld\n",sum+min-1); } return 0; }