一、笨笨玩游戏(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没有什么区别。
那到底该咋办?没头绪……
直到看到了社长大大的博客: ←点击链接
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