题意:DG在书店买书,从左到右第i本书价格为ai。
DG从左走到右,能买就买。如果已知DG买了m本书,问他原本最多有多少钱。
若无上限,输出“Richman”,若不可能买这么多书,输出“Impossible”。
1 ≤ n ≤ 105,0 ≤ m ≤ n,0 ≤ ai ≤ 109。
思路:价格为0的书必买,若价格为0的数量>m则无解
m=n则可以有无限钱
剩余的情况m减去价格为0的数量,剩余的一定是前m-1个和后面所有的最小值-1之和
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 110000
#define M 51
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1)
#define oo 1010000000 int a[N]; int main()
{
int cas;
scanf("%d",&cas);
for(int v=;v<=cas;v++)
{
int n,m;
scanf("%d%d",&n,&m);
int s=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(!a[i]) s++;
}
if(s>m)
{
printf("Impossible\n");
continue;
}
if(n==m)
{
printf("Richman\n");
continue;
}
m-=s;
ll ans=;
int k=;
if(m>)
{
for(int i=;i<=n;i++)
{
if(a[i])
{
m--; ans+=a[i];
}
if(m==){k=i; break;}
}
}
int mn=oo;
for(int i=k+;i<=n;i++)
if(a[i]) mn=min(mn,a[i]);
ans+=mn-;
printf("%lld\n",ans);
}
return ;
}