当前位置: 代码迷 >> 综合 >> PAT 1019 数字黑洞 (20分) ,1020 月饼 (25分)
  详细解决方案

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

热度:71   发布时间:2023-12-12 11:01:18.0

数字黑洞:

总结:
如果想输出四位数,如果小于三位数的前面补零法:
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;}elsebreak;}sum += X*a[i].unit;printf("%.2f",sum);return 0;
}