题目大意:
DG去书店买书,有n本书按顺序放置。买书的策略是从1到n本,遇到价格<=当前手中的钱的书就买
现在告诉你每本书的价格和DG总共买了多少本数,要求出DG手里的最大可能钱数
题解:
读入的时候统计一下价格为0的书的数目zero和价格不为0的数目l
如果zero>m,就是Impossible
如果m==l,就是Richman
否则
从前往后遍历价格不为0的书,前m本价格直接加和sum,然后再m+1到l本中找出最小值t,但就是sum+t-1
#include<bits/stdc++.h>
#include<cstring>
#define ll long long
#define INF 1000000007
using namespace std;
int main()
{
int T,n,m,x;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
vector<int>v;
for(int i=1; i<=n; ++i)
{
scanf("%d",&x);
if(x!=0)
v.push_back(x);
}
int len=v.size();
int zero=n-len;
if(m<zero)
puts("Impossible");
else if(m==n)
puts("Richman");
else
{
m-=zero;
ll sum=0;
int t=INF;
for(int i=0; i<len; ++i)
{
if(i+1<=m)
sum+=v[i];
else t=min(t,v[i]);
}
sum+=t-1;
printf("%lld\n",sum);
}
}
return 0;
}