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

2018 青島區域賽 J - Books

                                                Books

Sample Input

4
4 2
1 2 4 8
4 0
100 99 98 97
2 2
10000 10000
5 3
0 0 0 0 1

Sample Output

6
96
Richman
Impossible

題意描述:

給出n本書的價格和想要購買的書的數量m。購買書的規則為:每次按順序檢查每一本書,對於每一本正在檢查的書,如果有足夠的錢(不低於書價),將購買該書,錢數將減少該書的價格。如果錢數少於現在被檢查的書的價格,將跳過那本書。求出只能購買m本書的最大錢數。如果可以帶無限多的錢輸出“Richman”,如果不能實現只買m本書輸出“Impossible”。

解題思路:

有題意可知當n等於m是可以帶無限多的錢,其他情況先找出n本書中價格為0的本數。當價格為0的本數大於m時,則為不能實現只買m本書。當價格為0的本書小於等於m時,假設m減去價格為0的本書剩下k本,買下前k本價格不為0的書(因要求的結果是隻買m本書的最大錢數),找出剩下價格不為0的書中的價格最小的,輸出買下前k本價格不為0書的價格之和加上剩餘書中價格不為0的最低價格減一。

程式碼:

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