HDU ACM 4550 卡片游戏

分析:分为三部分处理,第一部分找到除0外最靠右的最小数字A作为第一位;第二部分是这个最小数字A前面的数字均按规则排列,也就是每取出一张大的放在第二部分的后面,小的放在第二部分的前面;第三部分就是这个最小数A后面的数字按原顺序放在最后即可;最终即可组出新的串。

例子:9876105432。

第一部分:1

第二部分:9876,处理后为6789

第三部分:05432

最后按照第一部分,第二部分,第三部分的顺序组出新串:1678905432既是最终结果。

#include<iostream>
using namespace std;

int main()
{
	int T,i,minnum,minindex,j,k;
	char a[105];
	char b[305];

	cin>>T;
	getchar();
	while(T--)
	{
		gets(a);
		minnum=100;
		for(i=strlen(a)-1;i>=0;i--)
			if(a[i]<minnum && a[i]!='0')
			{
				minnum=a[i];
				minindex=i;
			}

		if(minnum==100) minnum=a[0];
		b[0]=minnum;

		j=-2;
		k=-1;
		if(strlen(a)>=2)
		{
			if(minindex!=0)
			{
				k=j=150;
				b[k]=a[0];
				for(i=1;i<minindex;i++)
					if(b[k]>=a[i])
					{
				    	k--;
			    		b[k]=a[i];
					}
			    	else
					{
			    		j++;
			    		b[j]=a[i];
					}
			}
		}
		putchar(b[0]);
		for(i=k;i<=j;i++)
			putchar(b[i]);
		for(i=minindex+1;i<strlen(a);i++)
			putchar(a[i]);
		cout<<endl;
	}
	return 0;
}
时间: 2024-11-07 22:41:55

HDU ACM 4550 卡片游戏的相关文章

hdu 4550 卡片游戏 贪心

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4550 题意:有n(n <= 100)个0~9之间的卡片,从左往右将卡片放到之前的卡片最左边或者最右边:使得最后得到的数值最小,且无前导0: input: 4 0101 2342001 9876105432 9876543210 output: 1001 1002234 1678905432 1234567890 思路:如果没有0,则直接用双指针,模拟前后插入值即可:但是由于存在0,所以需要找出最小的

hdu 4550 卡片游戏

http://acm.hdu.edu.cn/showproblem.php?pid=4550 贪心 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <string> 5 #include <iostream> 6 #include <algorithm> 7 #define maxn 200 8 using namespace std; 9

hdu 2209 翻纸牌游戏

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2209 这个题难度还可以 我的思路:有n张牌成第一张牌开始如果是1,则第一张第二张第三张翻转,再看第二张,判断如果是1则第二张第三张第四张翻转,以此下去 不这样还不可以,还得分两种情况如001 按这种思路是不可以的所以还有一种情况不管如何先翻转第一和第二张牌再如上一种思路. 我的AC代码 第一种写法:直接法 #include<cstdio>#include<iostream>#inclu

HDU 1527 取石子游戏 威佐夫博弈

题目来源:HDU 1527 取石子游戏 题意:中文 思路:威佐夫博弈 必败态为 (a,b ) ai + i = bi     ai = i*(1+sqrt(5.0)+1)/2   这题就求出i然后带人i和i+1判断是否成立 以下转自网上某总结 有公式ak =[k(1+√5)/2],bk= ak + k  (k=0,1,2,-,n 方括号表示取整函数) 其中出现了黄金分割数(1+√5)/2 = 1.618-,因此,由ak,bk组成的矩形近似为黄金矩形 由于2/(1+√5)=(√5-1)/2,可以先

【sicily】卡片游戏

卡片游戏  Time Limit: 1sec    Memory Limit:32MB Description 桌上有一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n.当至少还剩两张牌时进行以下操作:把第一张牌扔掉,然后把新的第一张放到整叠牌的最后.输入n,输出每次扔掉的牌,以及最后剩下的牌. Input 第一行为一个整数t(0<t<40),表示测试用例个数.以下t行每行包含一个整数n(0<n<40),为一个测试用例的牌数. Output 为每个测试用例单独输出一行

HDU ACM 1103 Flo&#39;s Restaurant

分析:借助STL的min_element实现.每次更新最先被占用的桌子,具体见注释. #include<iostream> #include<algorithm> using namespace std; int main() { int A,B,C; char s[10]; int a[102],b[102],c[102]; int curtime,count,ans; int *p; //桌子最先空闲时间 while(cin>>A>>B>>C

NYOJ 905 卡片游戏

卡片游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 小明最近宅在家里无聊,于是他发明了一种有趣的游戏,游戏道具是N张叠在一起的卡片,每张卡片上都有一个数字,数字的范围是0~9,游戏规则如下: 首先取最上方的卡片放到桌子上,然后每次取最上方的卡片,放到桌子上已有卡片序列的最右边或者最左边.当N张卡片全部都放到桌子上后,桌子上的N张卡片构成了一个数.这个数不能有前导0,也就是说最左边的卡片上的数字不能是0.游戏的目标是使这个数最小. 现在你的任务是帮小明写段程序,

Sicily 1931. 卡片游戏

题目地址:1931. 卡片游戏 思路: 纯属数据结构中队列的应用,可以练练手. 具体代码如下: 1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 5 int main() { 6 int t; 7 cin >> t; 8 while (t--) { 9 int num; 10 cin >> num; 11 queue<int> store; 12 for (int

hdu 1527 取石子游戏(威佐夫博奕模板题)

取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3562    Accepted Submission(s): 1789 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的