卡片游戏 HDU - 4550

原题链接

考察:贪心+模拟

错误思路:

       预处理一遍>0的最小的数字和它在序列里出现的次数.在从头到尾遍历,讨论0与s[i]与minv的大小关系.用deque模拟

这样想其实没错,但是要讨论很多限制条件,看了别人的题解思路简单又快速...

正确思路:

       从右往左找,找到除0外最小的数字,它右边的直接按顺序放在后面,在它前面的要与当前队头比较再放入,最后把这个数字放在队头.

注意:不能从左往右找,因为出现次数不止一次.按我的代码,后面出现的最小数字就只能按顺序放了.

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <deque>
 6 using namespace std;
 7 typedef pair<int,int> PII;
 8 const int N = 110;
 9 char s[N];
10 int len;
11 PII check(int l,int r)
12 {
13     int minv = 10,pos = 0;
14     for(int i=r-1;i>=l;i--)
15     {
16         int t = s[i]-'0';
17         if(t<minv&&t) minv = t,pos = i;
18     }
19     PII p; p.first = minv,p.second = pos;
20     return p;
21 }
22 int main() 
23 {
24     int T;
25     scanf("%d",&T);
26     while(T--)
27     {
28         deque<int> d;
29         scanf("%s",s);
30         int len = strlen(s);
31         PII p = check(0,len);
32         int minv = p.first,pos = p.second;
33         d.push_back(s[0]-'0');
34         for(int i=1;i<pos;i++)
35         {
36             int t = s[i]-'0';
37             if(t<=d.front()) d.push_front(t);
38             else d.push_back(t);
39         }
40         if(pos) d.push_front(minv);
41         for(int i=pos+1;i<len;i++) d.push_back(s[i]-'0');
42         for(auto it:d) printf("%d",it);
43         printf("\n");
44     }
45     return 0;
46 }

 

posted @ 2021-02-21 12:20  acmloser  阅读(60)  评论(0编辑  收藏  举报