一、题目编号:
Problem F
二、简单题意:
Dong MW喜欢买东西的时候给刚刚好的钱,不找零。给出多组测试数据,第一个数据为书本的价钱,接下来五个数分别为1,5,10,50,100角的纸币的数量,求买这本书需要的最少的纸币数和最多的纸币数,如果不能不找零买这本书则输出“-1 -1”。
三、解题思路形成过程
要使纸币的数量最少,则需要尽可能选取大面额的纸币,从大面额纸币开始判断,可以选就在价钱中减去这部分,直至价钱减少至0。此时花费的纸币数量即为最小值。如果左右面额纸币判断结束价格都无法变为0,则无法买这本书,输出“-1 -1”。要使纸币的数量最大,只需让总钱数减去书的价格所需要的数量最少,算法同上。
四、感想
题本身不难,但是调了好久,好几个细节地方没有注意到导致浪费了很多时间。还是要多注意细节啊!
五、AC代码
#include<iostream>using namespace std;
int money[]={1,5,10,50,100};
int change(int price,int m[5])
{
for(int i=4;i>=0;i--)
{
if(price==0)
break;
if(price>=money[i])
{
if(price/money[i]<=m[i])
{
m[i]-=price/money[i];
price-=price/money[i]*money[i];
}
else
{
price-=m[i]*money[i];
m[i]=0;
}
}
}
return price;
}
int main()
{
int n,price,price2;
cin>>n;
while(n--)
{
int least=0,largest=0,totalnum=0,totalmoney=0,num[5],num2[5];
cin>>price;
for(int i=0;i<5;i++)
{
cin>>num[i];
num2[i]=num[i];
totalnum+=num[i];
totalmoney+=num[i]*money[i];
}
price2=totalmoney-price;
int x=change(price,num);
if(x!=0)
cout<<-1<<" "<<-1<<endl;
else
{
int w=0;
for(int i=0;i<5;i++)
{
w+=num[i];
}
least=totalnum-w;
int y=change(price2,num2);
for(int i=0;i<5;i++)
{
largest+=num2[i];
}
cout<<least<<" "<<largest<<endl;
}
}
return 0;
}