PAT 1038. Recover the Smallest Number

给定N(N<10000)段“数字片段”,把它们连成一个数,要求连成的数尽量小。

当时有个朦胧的想法是“我要把小的片段尽量排前面”,但是怎么样算是“小的片段”呢?

然后是想到“前面的不会影响到后面的”,我不知道具体该怎么表达,反正想到“前面的不会影响到后面的”以后,就感觉这个问题是贪心着来,不用动规着来,也就是说,只用一遍排序,然后就可以连起来输出了。

然后思考的就是,一遍排序,那么只需要对“数字片段”进行两两地判大小就好。

所以重点就在怎么比较了。显然,片段a和片段b如果一样长,比较方法就不用说了。如果其中有一个比较长,比如说b比a长,那么,先比较b前面那部分,如果b前面还没超出a长度的那部分就能比出大小,那也没问题了。如果b前面还没有超出a的部分,每一位都跟a的对应位相等,怎么办?我的方法是比较a+b和b+a。(还是说不出理由来,各种凭直觉呃)

就这样,过掉了。

#include<cstdio>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=10003;
string s[N];
int n;
bool comp(string a,string b){
	string c;
	int i;
	for(i=0;i<a.length()&&i<b.length();i++)
		if(a[i]!=b[i])
			return a[i]<b[i];
	c=a;
	a=a+b;
	b=b+c;
	return a<b;
}
int main(){
	scanf("%d",&n);
	int i;
	for(i=0;i<n;i++)
		cin>>s[i];
	sort(s,s+n,comp);
	string ans="";
	for(i=0;i<n;i++)
		ans+=s[i];
	while(ans.size()>1&&ans[0]=='0')
		ans.erase(ans.begin());
	cout<<ans<<endl;
return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值