2018青岛区域赛J:Books
从左到右一次扫n本书,如果当前钱包里面的钱大于书的价钱,就买下来(必须买),问最多能带多少钱,钱数必须是非负整数,如果没有方案,就输出Impossible,如果可以带无限的钱,就输出Richman.
先找出0的个数,因为0元的是必须要买的,如果0的数量大于需要的数量,输出impossible。当n=m的时候可以带无限的钱,输出Richman。如果0的数量小于需要的数量,就从头买书,直到最后一本,再从这一本开始从和面找一本价钱最低的,加到总价钱里面。
#include <stdio.h>
long long a[100010];
int main()
{
long long t, x, k, n, m, minn, s, sum, ans, i;
scanf("%lld",&t);
while (t--)
{
ans=0;
sum=0;
minn=99999999999;
scanf("%lld%lld", &n, &m);
for (i = 0; i < n; i++)
{
scanf("%lld", &a[i]);
if (a[i]==0)
ans++;
}
if (ans > m)
{
printf("Impossible\n");
continue;
}
if(n==m)
{
printf("Richman\n");
continue;
}
m-=ans;
s=0;
for (i = 0; i < n; i++)
{
if (a[i]==0)
continue;
s++;
if (s <= m)
sum+=a[i];
if (s > m)
{
if (a[i] < minn)
minn=a[i];
}
}
printf("%lld\n", sum+minn-1);
}
return 0;
}