卡片游戏 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 }