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
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"<=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"<5){//剩下的需要值比5大 ,这时候1和5都已经被取完了,只剩下10了 
                        	if((10-cha)<=ans1&&(num10-ans10)>=1){//10转化为1 
                        		ans1-=(10-cha);
                        		ans10++;
							} 
							else{
							//	cout<<"3"<=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"<

 

你可能感兴趣的:(基础知识)