1. 程式人生 > >2018ICPC青島重現賽

2018ICPC青島重現賽

第二題做了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; }