hdu 4550 卡片游戏

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4550

题目中文,就不解释题意了


这个题A后我也看过其他的解题报告,但是肿么有种感觉我的算法更容易理解的样子呢,嘿嘿


看到这个题首先想到的就是取出一张卡片p后,如果p小于等于当前序列第一个数字的话

那么就放在最左边,否则放在最右边。但是题目中的数字是从0开始,这个0就成问题了。


首先毫无疑问的是最后的结果第一位肯定是所有卡片中所有非0数字中最小的那个,我们

就选择“非0中最小的最右的那个数字,下标为idx”做结果的第一个数字(为什么简单分析下

就能得出),找到这个数字后这个问题就变得简单了,不管我后面的0有多少个多少情况,

反正我第一个数字已经找到了,后面随便怎么放都不会出现有前导0的非法情况。

于是就可以从0到idx直接使用先前提到的方法而不需要判断特殊情况,而idx后面的数字肯

定不能放在前面,最后直接按顺序输出idx后面的数字就行了

因为要前插后插感觉用链表有点麻烦就用了两个数组。

#include<stdio.h>
#include<string.h>
char s[110];
char a[110],b[110];
int main()
{
	int i,len,cas;
	scanf("%d",&cas);
	while(cas--)
	{
		scanf("%s",s);
		len=strlen(s);
		int idx,up1=0,up2=0;
		char min='9';

		for(i=0;i<len;i++)
			if(s[i]!='0'&&s[i]<=min) min=s[i],idx=i;

		for(i=0;i<idx;i++)
			if(up1==0||s[i]<=a[up1-1])
				a[up1++]=s[i];
			else
				b[up2++]=s[i];

		printf("%c",min);
		for(i=up1-1;i>=0;i--)
			printf("%c",a[i]);
		for(i=0;i<up2;i++)
			printf("%c",b[i]);
		for(i=idx+1;i<len;i++)
			printf("%c",s[i]);
		printf("\n");
	}
	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值