【ZOJ4067】Books(贪心)

题意: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 ;
}
上一篇:ArcGIS API for JavaScript 入门教程[2] 授人以渔


下一篇:php 正则替换特殊字符 和检测是否是中文