【NOIP普及组】2016年模拟考试(9.3)——笨笨玩游戏

一、笨笨玩游戏(game.cpp

【题目描述】

一天,笨笨和妈妈玩游戏,妈妈 给笨笨出N个正整数,让笨笨把这N个正整数连接生成一个的整数,每个正整数只使用一次,让笨笨告诉妈妈这样生成的大整数的最大值。

例如,给出4个整数:123, 124, 56, 90,可以连接生成的大整数有:1231245690, 1241235690, 5612312490, 9012312456, 9056124123等等,对本例,总共可以生成24个大整数。而其实最大整数是:9056124123

【输入】

1行:个整数N1<=N<=50

2行:N个整数,每个整数不超过INT_MAX

【输出】

1行:生成的最大整数。

【样例输入】

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值