https://cn.vjudge.net/problem/ZOJ-4067
题目大意一共n本书,要从前往后取m本,如果当前手中的钱比第i本书大,就一定要买下来,然后减去这本书的钱继续从前往后买。
求出初始最大可能的钱的数量,如果是无限的输出 Richman 如果不可能买m本则输出 Impossible
明显,m==n时 钱是无限的
书的价格中0的数量大于m时输出Impossible
否则需要买的书等于 x=m-0的数量 (有个坑点,有可能要买的数量为0)要先判断 是否为0
然后从前往后加上 x本书的价钱,然后加上最后不能买的 书的价钱里面最小值减1 ;
(┭┮﹏┭┮)没有先判断是否为0 ,然后wa了挺久,
附上代码
#include<iostream>
#include<cstdio>
using namespace std;
const int inf=10000000019;
int a[5000007];
int n,m,t;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
int mi=inf;
int sum=0;
long long ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]!=0&&a[i]<mi)mi=a[i];
if(a[i]==0)sum++;
}
if(m==n)
{
printf("Richman\n");
continue;
}
else if(sum>m)
{
printf("Impossible\n");
continue;
}
else if(m==0)
{
printf("%d\n",mi-1);
continue;
}
int x=m-sum;
int i,j;
for(i=1;i<=n;i++)
{
if(x==0)break;
if(a[i]!=0)
{
ans+=a[i];
x--;
}
}
int pp=inf;
for(j=i;j<=n;j++)
{
if(a[j]!=0)
{
if(a[j]<pp)pp=a[j];
}
}
ans+=(pp-1);
printf("%lld\n",ans);
}
return 0;
}