1. 程式人生 > >2018-7-18 ACM 刷題日記

2018-7-18 ACM 刷題日記

<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);
}