【ZOJ 4067】Books

【链接】 我是链接,点我呀:)
【题意】

【题解】

统计a中0的个数cnt0 然后m减去cnt0 因为这cnt0个0是一定会取到的。 如果m==0了 那么直接找到数组中的最小值mi 输出mi-1就好 否则 找到剩余的前m个非0的数字 设第m个非0数字为a[i],则在i+1..n中再取最小值mi 则输出前m个非0数字和+mi-1 m<0的话,impossible n==m的话,Richman

【代码】

#include <bits/stdc++.h>
#define ll long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
using namespace std;

const int N = 1e5;

int n,m,cnt0;
int a[N+10];

int main(){
	#ifdef ccy
			freopen("rush.txt","r",stdin);
	#endif
	int T;
	scanf("%d",&T);
	while (T--){
		cnt0=0;
	 	scanf("%d%d",&n,&m);
	 	for (int i = 1;i <=  n;i++) scanf("%d",&a[i]);
	 	rep1(i,1,n) if (a[i]==0) cnt0++;
	 	if (m==n){
	 	 	puts("Richman");
	 	 	continue;
	 	}
	 	if (m<cnt0){
	 	 	puts("Impossible");
	 	 	continue;
	 	}
		m-=cnt0;
		int mi = 1e9+7;
		rep1(i,1,n){
		 	if (a[i]<mi && a[i]!=0){
		 	 	mi = a[i];
		 	}
		}
		if (m==0){
		 	printf("%d\n",mi-1);
		 	continue;
		}
		ll temp = 0;
		rep1(i,1,n){
		 	if (a[i]!=0){
		 		temp +=a[i];
		 		m--;
		 		if (m==0){
		 			int mi = 1e9+7;
		 		 	rep1(j,i+1,n)
		 		 		if (a[j]!=0 && a[j]<mi){
		 		 		 	mi = a[j];
		 		 		}
		 		 	if (mi>1e9){
		 		 	 	printf("%lld\n",temp);
		 		 	}else{
		 		 	 	printf("%lld\n",temp+mi-1);
		 		 	}
		 		 	break;
		 		}
		 	}
		}



	}
 	return 0;
}
posted @ 2018-11-07 08:40  AWCXV  阅读(142)  评论(0编辑  收藏  举报