如果书中有价格有零的,那么零都要加上。之后m=m-零的个数,之后选取前m本非零的书籍加到sum上,最后从剩下的书籍中选择价格最小的书籍加到sum上,最后sum-1就行了。要注意如果n==m,直接输出richman。
代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int inf=1e5+7;
int arr[inf];
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
int flag=0,ling=0;
ll sum=0;
int themin=~(1<<31);
scanf("%d %d",&n,&m);
for(int i=0;i<n;++i)
{
scanf("%d",&arr[i]);
if(arr[i]==0)++ling;
else if(arr[i]<themin)
{
themin=arr[i];
}
} //如此只要是能够看出来的,并且是不能够证明是错误的,用贪心就行了。但是要注意题意。
if(m==n)
{
printf("Richman\n");
continue;
}
if(ling==m) //思考全面啊一定要的,除了一个,m==0
{
printf("%d\n",themin-1);
}
else if(ling >m)
{
printf("Impossible\n");
}
else //ling<m
{
int thenum=m-ling;
for(int i=0;i<n;++i)
{
if(arr[i]!=0)
{
sum+=arr[i];
thenum--;
if(thenum==0)
{
i++;
int minmin=~(1<<31);
for(int j=i;j<n;j++)
{
if(arr[j]<minmin&&arr[j]!=0)
minmin=arr[j];
}
sum+=(minmin-1);
break;
}
}
}
printf("%lld\n",sum);
}
}
return 0;
}