2018ICPC青島賽區J題
阿新 • • 發佈:2018-12-19
AC程式碼;
#include<iostream> #include<string> #include<cstring> #include<iomanip> #include<cmath> #include<algorithm> #include<stdio.h> #include<queue> #include<stack> #include<vector> using namespace std; # define inf 0x3f3f3f3f # define maxn 500000+100 # define ll long long int a[maxn]; int b[maxn]; ll Min(ll t1,ll t2) { return t1>t2?t2:t1; } int main() { int T; scanf("%d",&T); while(T--) { int n,m; int num=0; scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); if(a[i]!=0)b[++num]=a[i];//num代表的是非0的個數,所以n-num就是0的個數 } if(n-num>m)// 如果說0的個數比要買的書的個數還多,輸出impossivle { printf("Impossible\n"); continue; } if(n==m)//如果買的書的Ŕ個數和書的總數相等,則輸出imposible { printf("Richman\n"); continue; } // if(m==0)//如果買的書的個數為0 // { // if(minn==0) printf("Impossible\n");//最小值為0,肯定不行 // if(minn>=1) printf("%lld\n",minn-1);//否則輸出最小值減去1 // continue; // } // } ll ans=0,temp=inf; for(int i=1; i<=num; i++) { if(i<=m-n+num)ans+=b[i]; else temp=Min(temp,b[i]); } printf("%lld\n",ans+temp-1); } // ll sum=0; // m-=num;//這裡要找的是非0的數的個數 // int i=1; // ll temp=inf; // while(i<=n) // { // if(a[i]==0)continue; // if(m>0) // { // sum+=a[i]; // m--; // } // else if(m==0) // temp=Min(temp,a[i]); // i++; // } // // 這個時候m本已經找完了,只需要再找一本買不起的書的價格再減去1就可以了。 // } return 0; }