hdu1288(贪心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1288

题目意思:给一个n是要达到的值,再给三个数num1,num5,num10表示1的个数有num1个、5的个数有num5个、10有num10个,求能达到n的方案中使得ans1+ans5+ans10的值最大的那个方案。(ans1表示1取多少个,ans5表示5取多少个,ans10表示10取多少个)。

题解:先把1全部取完。再取5,够的话,就1和5之间转换(5=1*5),注意!!!但是可能会出现无论这么转换都达不到n的情况,不够的话,5全取完。再取10,够的话,就1、5、10转换(10=1*10或者10=1*5+5*1或者10=5*2),注意!!!这里也可能会出现无论这么转换都达不到n的情况,不够的话,直接false。

ac代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,num1,num5,num10;

int main(){
	while(~scanf("%lld%lld%lld%lld",&n,&num1,&num5,&num10)){
		if(n==0&&num1==0&&num5==0&&num10==0)
		break;
		ll t0=n-num1*1;//1用完还剩多少 
		ll ans1=0;
		ll ans5=0;
		ll ans10=0;
		int flag=0; 
		if(t0<=0){//1的个数够n 
			ans1+=n;
		}
		else{//1的个数用完了 不够n  t0>0
		    ans1+=num1;
			ll t1=t0-num5*5;//5用完还剩多少 
			if(t1<=0){//5的个数够n,但是可能会出现无法分配的情况   说明1和5的总和超过n,但不一定能达到n 
				if(t0%5==0){//如果t1是5的倍数  
					ans5+=(t0/5);
				}
				else//t0不是5的倍数 ,但是可能出现无法分配的情况 
				{
					ans5+=(t0/5);
					int cha=t0%5;
					if((5-cha)<=ans1&&(num5-ans5)>=1){
						ans1-=(5-cha);
						ans5++;
					}
					else{
					//	cout<<"1"<<endl;
						flag=1;
					}
				}
			}
			else{//5的个数用完了,不够 
			    ans5+=num5;
				ll t2=t1-num10*10;//10用完还剩多少 
				if(t2<=0){//10的个数够n,但是可能出现无法分配的情况 
					if(t1%10==0){//如果t1是10的倍数 
						ans10+=(t1/10);
					}
					else{//t1不是10的倍数,无法分配的情况 
					    ans10+=(t1/10);
					    int cha=t1%10;
                        if(cha<5){//剩下的需要值比5小 ,这时候1和5都已经被取完了,只剩下10了
                        	if((num10-ans10)>=1&&ans5>=1&&ans1>=(10-cha-5)){//(10-cha)转化为1和5 
                        		ans1-=(10-cha-5);
                        		ans5--;
                        		ans10++;
							}
							else if((10-cha)<=ans1&&(num10-ans10)>=1){//(10-cha)转化为1
								ans1-=(10-cha);
								ans10++; 
							}
                        	else{
                        	//	cout<<"2"<<endl;
                        		flag=1;
							}
						}
                        else if(cha>5){//剩下的需要值比5大 ,这时候1和5都已经被取完了,只剩下10了 
                        	if((10-cha)<=ans1&&(num10-ans10)>=1){//10转化为1 
                        		ans1-=(10-cha);
                        		ans10++;
							} 
							else{
							//	cout<<"3"<<endl;
								flag=1;
							}
						}
						else{//剩下的需要值等于5 
							if(ans5>=1&&(num10-ans10)>=1){//10转换为5+1个5 
								ans5-=1;
								ans10++;
							}
							else if(ans1>=5&&(num10-ans10)>=1){//10转化为5+5个1 
								ans1-=5;
								ans10++;
							}
							else{
							//	cout<<"4"<<endl;
								flag=1;
							} 
						}
					}
				}
				else{//10的个数不够n,直接输出no 
			//	cout<<"5"<<endl;
					flag=1; 
				}
			}
		}
		if(!flag){
			printf("%lld YiJiao, %lld WuJiao, and %lld ShiJiao\n",ans1,ans5,ans10);
		}
		else{
			printf("Hat cannot buy tea.\n");
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值