这个题想了好久也没想出来,转不过弯来啊。
思路:
先讨论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;
}