The 2018 ACM-ICPC Asia Qingdao Regional Contest (Mirror) - J Books(貪心)
阿新 • • 發佈:2018-11-11
這個題想了好久也沒想出來,轉不過彎來啊。
思路:
先討論Impossible的情況,如果書的價格為0的個數大於所要買的書本的數量,則為Impossible的情況。
然後是Richman的情況,如果n==m則為Richman的情況。
接下來是一般的情況,先將0項去除,然後累加前m減去0項的數目,然後加上後面序列的最小值-1.
程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> using namespace std; const int maxn=1e5+5; typedef long long ll; int t; int n,m; vector<ll> v; int main() { while (scanf("%d",&t)!=EOF) { while (t--) { v.clear(); scanf("%d%d",&n,&m); int num=0; for (int i=0;i<n;i++) { ll x; scanf("%lld",&x); if(x==0) { num++; } else { v.push_back(x); } } if(m==n) { printf("Richman\n"); continue; } else if(num>m) { printf("Impossible\n"); continue; } int Size=v.size(); int rnum=m-num; ll sum=0; for (int i=0;i<rnum;i++) { sum+=v[i]; } ll Min=0x3f3f3f3f; for (int i=rnum;i<Size;i++) { Min=min(Min,v[i]); } printf("%lld\n",sum+Min-1); } } return 0; }