PAT 1019 数字黑洞 (20分) ,1020 月饼 (25分)

数字黑洞:

总结:
如果想输出四位数,如果小于三位数的前面补零法:
cout<<setw(4)<<setfill(‘0’)<<s;
如果想将int a = 9;转化为四位数,不够前面补零法:
#include
stringstream ss;
ss<<<<setw(4)<<setfill(‘0’)<<a;
ss>>s;

解题思路:
用string字符串,接收四位数,(通过setw(4)方法填充,输入时没有满四位数的值
将字符串,通过ni()方法,对string的每一个数字进行排序,并求出该字符串对应的整型值A
将字符串,通过xun()方法,对string的每一个数字进行排序,并求出该字符串对应的整型值B
X = A-B,当X不等于黑洞数或0时,
循环,将A,B作为字符串按照第二步,第三部,重复

#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <sstream>
using namespace std;
bool cmp(int a,int b)//降序
{
    return a>b;
}
int ni(string a);
int xun(string a);
void print(int a,int b,int c);
int main()
{
    string s;
    cin>>s;

    stringstream ss;
    ss << setw(4) << setfill('0') << s ;
    ss >> s;
    int t = ni(s)- xun(s);
    print(ni(s),xun(s),t);

    while(6174 != t && t!=0)
    {
        s = to_string(t);
        stringstream ss1;
        ss1 << setw(4) << setfill('0') << s ;
        ss1 >> s;
        t = ni(s) - xun(s);
        print(ni(s),xun(s),t);
    }
    return 0;
}
int ni(string a)//输入一个字符串,把它各个数字非递增排序,并返回这四个数字的四位数
{
    vector<int> v;
    for(int i=0;i<4;i++)
    {
        v.push_back(a[i]-'0');
    }
    int x=0,y=0;
    sort(v.begin(),v.end(),cmp);
    for(int i=0;i<4;i++)
    {
        x=x*10+v[i];
    }
    return x;
}
int xun(string a)////输入一个字符串,把它各个数字非递减排序,并返回这四个数字的四位数
{
    vector<int> v;
    for(int i=0;i<4;i++)
    {
        v.push_back(a[i]-'0');
    }
    int x=0,y=0;
    sort(v.begin(),v.end());
    for(int i=0;i<4;i++)
    {
        x=x*10+v[i];
    }
    return x;
}
void print(int a,int b,int c)//按照格式,输出54
{
    cout<<setw(4)<<setfill('0')<<a;
    cout<<" - ";
    cout<<setw(4)<<setfill('0')<<b;
    cout<<" = ";
    cout<<setw(4)<<setfill('0')<<c;
    cout<<"\n";
}

月饼:

总结:
使用sort进行排序时,此时sort进行排序的时vector定义的是结构体数组类型,sort的第三个参数的自定义函数需特别注意:
bool cmp(nooncake a,nooncake b)
{
return a.unit>b.unit;
}

解题思路:贪心算法
首先按照所给的总价与数量分别求出单价,然后给单价排序,从高价到低价,
每次用完第一个高价的数量,就往下递减,如此反复,直至满足需求为止。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct nooncake
{
    float mount,price,unit;
};
bool cmp(nooncake a,nooncake b)
{
    return a.unit>b.unit;
}
int main()
{
    int N,X;
    cin>>N>>X;
    vector<nooncake> a(N);

    for(int i=0;i<N;i++)
    {
        cin>>a[i].mount;
    }
    for(int i=0;i<N;i++)
    {
        cin>>a[i].price;
        a[i].unit = a[i].price/a[i].mount;
    }

    sort(a.begin(),a.end(),cmp);
    float sum = 0;
    int i;
    for(i=0;i<N;i++)
    {
        if(a[i].mount<X)
        {
            sum +=a[i].mount*a[i].unit;
            X = X - a[i].mount;
        }
        else
            break;
    }
    sum += X*a[i].unit;
    printf("%.2f",sum);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38173631/article/details/104450446