一、笨笨玩游戏(game.cpp)
【题目描述】
一天,笨笨和妈妈玩游戏,妈妈 给笨笨出N个正整数,让笨笨把这N个正整数连接生成一个“大”的整数,每个正整数只使用一次,让笨笨告诉妈妈这样生成的大整数的最大值。
例如,给出4个整数:123, 124, 56, 90,可以连接生成的大整数有:1231245690, 1241235690, 5612312490, 9012312456, 9056124123等等,对本例,总共可以生成24个大整数。而其实最大整数是:9056124123
【输入】
第1行:1 个整数N(1<=N<=50)
第2行:N个整数,每个整数不超过INT_MAX。
【输出】
第1行:生成的最大整数。
【样例输入】
4
123 124 56 90
【样例输出】
9056124123
--------------------------------------------------------------------------------------------------------------------
此题一看,很显然就是“贪心的排序”,很多人直接想到了strcmp,那多简单,对吧,但是直接strcmp错了!而我,不是用的strcmp,就……还是错了。
首先先给找不到数据的小伙伴4个数据:
输入 输出
2 9 98 998
2 98 9 998
2 3 34 343
2 34 3 343
其实直接strcmp比较“9”和“98”会得到“98”更大,事实上是“9”放前面。
而我原来的方法是一位一位用for循环来比,和strcmp没有什么区别。
那到底该咋办?没头绪……
直到看到了社长大大的博客:2016普及组模拟考试 01题 ←点击链接
666666666666666666666666666666
真的太6了
正确方法:
将待连接的两个数(或者说字符串)按照一前一后和一后一前连接起来存,然后直接比较两个字符串就OK了,啊啊啊啊太巧妙了啊!
我的代码(自然没有社长大大的短):
#include<cstdio>
#include<cstring>
int n;
char a[52][12],q[24],p[24],t[12];
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);//文件输入输出,不要自己删
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",a[i]);
for(int i=0;i<n;i++)//其实就是排序
for(int j=i+1;j<n;j++)
{
int leni=strlen(a[i]),lenj=strlen(a[j]);
strcpy(q,a[i]);//将a[i]复制到临时变量q中
for(int k=0;k<lenj;k++)
q[k+leni]=a[j][k];//将a[j]依次连接在q后面
strcpy(p,a[j]);
for(int k=0;k<leni;k++)
p[k+lenj]=a[i][k];//同上
if(strcmp(q,p)<0)
{
strcpy(t,a[i]);
strcpy(a[i],a[j]);
strcpy(a[j],t);
}//比较看是否要交换
}
for(int i=0;i<n;i++)
printf("%s",a[i]);//直接输出
return 0;
}
By WZY