题目链接: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;
}