数字黑洞:
总结:
如果想输出四位数,如果小于三位数的前面补零法:
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;
}