2018-7-18 ACM 刷題日記
阿新 • • 發佈:2019-01-07
<Codeforces - 1009B>
題意:
給定一個只由'0'、'1'、'2' 組成的串,只能將0 1互換,1 2互換,不能將0 2互換,求形成字典序最小的的串。
思路:
因為1既可以和0換,又可以和2換,所以1的位置是自由的,即1可以挪到任意位置,而0和2的相對位置是固定的,也就是說,可以先將串中所有1都刪了,剩下這個新串只由0和2組成,這個順序就是不能動的了,接下來我需要將刪掉的這串1放進新串的某個位置裡,要想字典序最小,就讓2的位置儘可能靠後即可,所以將這一串一,放在第一個出現的2前面即可。用佇列模擬一下就行了,注意第一個2出現的位置pos的初值,應該賦值為ln,即字串長度,這樣00000,或者00100這樣沒有2出現的樣例,就能避免重複壓入佇列的狀況。
本人AC程式碼:
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <set> #include <map> #include <vector> #include <queue> #include <iostream> #include <algorithm> using namespace std; const int maxx = 1e5 + 7; char ss[maxx]; queue <char> qua; void solve(char s[maxx]) { int ln = strlen(s); int pos = ln, cnt = 0; for(int i = 0; i < ln; i++) if(s[i] == '1') cnt++; for(int i = 0; i < ln; i++) { if(s[i] == '0') qua.push(s[i]); else if(s[i] == '2') { pos = i; break; } else continue; } while(!qua.empty()) { printf("%c", qua.front()); qua.pop(); } for(int i = 1; i <= cnt; i++) printf("1"); for(int i = pos; i < ln; i++) { if(s[i] != '1') qua.push(s[i]); } while(!qua.empty()) { printf("%c", qua.front()); qua.pop(); } printf("\n"); } int main() { scanf("%s", ss); solve(ss); }