1. 程式人生 > >2018青島區域賽J:Books

2018青島區域賽J:Books

 從左到右一次掃n本書,如果當前錢包裡面的錢大於書的價錢,就買下來(必須買),問最多能帶多少錢,錢數必須是非負整數,如果沒有方案,就輸出Impossible,如果可以帶無限的錢,就輸出Richman.

先找出0的個數,因為0元的是必須要買的,如果0的數量大於需要的數量,輸出impossible。當n=m的時候可以帶無限的錢,輸出Richman。如果0的數量小於需要的數量,就從頭買書,直到最後一本,再從這一本開始從和麵找一本價錢最低的,加到總價錢裡面。


#include <stdio.h>
long long a[100010];
int main()
{
	long long t, x, k, n, m, minn, s, sum, ans, i;
	scanf("%lld",&t);
	while (t--)
	{
		ans=0;
		sum=0;
		minn=99999999999;
		scanf("%lld%lld", &n, &m);
		for (i = 0; i < n; i++)
		{
			scanf("%lld", &a[i]);
			if (a[i]==0)
				ans++;
		}
		if (ans > m)
		{
			printf("Impossible\n");
			continue;
		}
		if(n==m)
		{
			printf("Richman\n");
			continue;
		}
		m-=ans;
		s=0;
		for (i = 0; i < n; i++)
		{
			if (a[i]==0)
				continue;
			s++;
			if (s <= m)
				sum+=a[i];	
			if (s > m)
			{
				if (a[i] < minn)
					minn=a[i];
			}
		}
		printf("%lld\n", sum+minn-1);
	}
	return 0;
}