2018ICPC青島重現賽
阿新 • • 發佈:2018-11-11
第二題做了J題,題意是給n本書的價格,然後要從第一本開始買,不夠買就跳過,然後給定這個人買的本書,判斷這個人最大可能有的錢數
考慮了一下我們只要分情況考慮一下就好了,首先是n==m,能全買的錢肯定是無限大,然後如果價格為0的數量大於m,就是不可能的情況,因為0一定要買
然後就是剩下的情況,把0的全部買了,然後從頭開始買,剩下的找到一個最小值把錢數再加上這個數-1即可,因為如果再打就可以買這一本了,所以這是最大的
程式碼:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+50;
const ll INF=1e10+10;
int t,n,m;
ll a[N];
bool vis[N];
int main(void){
scanf("%d",&t);
while(t--){
memset(a,0,sizeof(a));
memset(vis,false,sizeof(vis));
scanf("%d%d",&n,&m);
int zero=0;
for(int i=0;i<n;i++){
scanf("%lld" ,&a[i]);
if(a[i]==0){
zero++;
}
}
if(n==m){
printf("Richman\n");
continue;
}
if(zero>m){
printf("Impossible\n");
}else{
m-=zero;
ll ans=0;
for( int i=0;i<n && m>=1;i++){
if(a[i]==0){
continue;
}
ans+=a[i];
vis[i]=true;
m--;
}
ll Min=INF;
for(int i=0;i<n;i++){
if(a[i]==0 || vis[i]==true){
continue;
}
if(a[i]<Min){
Min=a[i];
}
}
ans+=(Min-1);
printf("%lld\n",ans);
}
}
return 0;
}