1005-F

来源:互联网 发布:高中生刷题软件 编辑:程序博客网 时间:2024/05/15 23:50
        1.题目编号:1005-F
2.简单题意:首先输入n代表几组数据,再输入一个数,是需要凑的钱数,再输入5个数据,分别是给的1元、5元、10元、50元、100元的张数,分别输出最少跟最多的张数,能把给的数据钱数凑出来,凑不出来输入-1,-1
3.解题思路形成过程:从100元最大的开始,根据钱数是否比100大,根据100的张数是否有,对钱进行除法,得出张数,余数再循环50元的,如果比100小,直接循环50,这样一直循环下去,;总钱数减去给的钱数,得到的是用最少的张数凑出来,再用每个元的张数对应着相减,得到的就是最多张数。
4.感想:做题要找规律,要学会找算法,而且编程题只要错一点或者有一点没做好,结果就会错,这道题里面有许多需要标记张数,做题做事要认真,首先不能把自己绕晕,里面定义的量如果太多,只用a,b,c...标记,最后自己都不知道是什么了,还要注释比较麻烦,最好能用一些自己一看就明白的定义词然后就是要有一个清晰的思路跟头脑。

5.AC代码:

#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<math.h>#include<iomanip>using namespace std;int main(){    int n;    int a[6]={1,5,10,50,100};    cin>>n;    while(n--)    {        int p,b[5];        cin>>p>>b[0]>>b[1]>>b[2]>>b[3]>>b[4];        int sum=b[0]*a[0]+b[1]*a[1]+b[2]*a[2]+b[3]*a[3]+b[4]*a[4];        int min_=0,max_=0,min_2=0;            int tmp=p;            for(int i=4;i>=0;i--)            {                if(a[i]<=tmp)                {                    int tmp_min=0;                    tmp_min=tmp/a[i];                    if(tmp_min<=b[i])                    {                        min_+=tmp_min;                        tmp%=a[i];                    }                    else if(tmp_min>b[i])                    {                        min_+=b[i];                        tmp=tmp-a[i]*b[i];                    }                    if(tmp==0)                    {                        break;                    }                }            }            if(tmp!=0)            {                min_=-1;max_=-1;            }            int tmp2=sum-p;            for(int i=4;i>=0;i--)            {                if(a[i]<=tmp2)                {                    int tmp_min2=0;                    tmp_min2=tmp2/a[i];                    if(tmp_min2<=b[i])                    {                        min_2+=tmp_min2;                        tmp2%=a[i];                    }                    else if(tmp_min2>b[i])                    {                        min_2+=b[i];                        tmp2=tmp2-a[i]*b[i];                    }                    if(tmp2==0)                    {                        break;                    }                }            }            max_=b[0]+b[1]+b[2]+b[3]+b[4]-min_2;            if(tmp2!=0)            {                min_=-1;max_=-1;            }            cout<<min_<<" "<<max_<<endl;    }    return 0;}


0 0