【codeforces】Round #604 (Div. 2)(A. B.)

Codeforces Round #604 (Div. 2) : http://codeforces.com/contest/1265

A. Beautiful String

鏈接

http://codeforces.com/contest/1265/problem/A

題意

給你一個字符串,字符串種只包含 ‘a’, ‘b’, ‘c’, ‘?’ 四種字符,要求使用 ‘a’, ‘b’, ‘c’ 替換字符串種的 ‘?’ 使得字符串是一個 Beautiful String(字符串中沒有連續的兩個字符相同的)。

思路

  1. 遍歷字符串,若當前字符 s[i]‘?’,先假設它是 ‘a’
    1. 如果當前字符的前面有字符 s[i-1] 並且與當前字符相等(s[i-1] == s[i]),那麼再假設它是 ‘b’
    2. 如果後面有字符並且與當前字符相等,那麼當前字符可能是 ‘b’ 也可能是 ‘c’,(因爲不知道 1.1. 成不成立)需要在聯合前面的字符判定,因爲可能當前字符是 ‘b’1.1. 成立),所以假設當前字符是 ‘c’,再嘗試判斷與前面的字符是否相等,如果相等(說明 1.1. 不成立)改成 ‘b’,如果不相等,說明前後都不等,不用改了。
  2. 遍歷的同時做合理性檢查,如果當前字符不是第一個字符,檢查當前字符是否與前一個字符相等,相等則返回 -1。

AC代碼

#include <bits/stdc++.h>
using namespace std;

int main(int argc, char const *argv[])
{
	int t;
	cin>>t;
	string s;
	while(t--) {
		cin>>s;
		bool ans = 0;
		int n = s.size();
		for (int i = 0; i < n; ++i) {
			if(s[i] == '?') {
				s[i] = 'a';
				if(i > 0 && s[i-1] == s[i]) s[i] = 'b';
				if(i < n && s[i] == s[i+1]) s[i] = 'c';
				if(i > 0 && s[i-1] == s[i]) s[i] = 'b';
			}
			if(i != 0 && s[i-1] == s[i]) {
				ans = 1;
				break;
			}
		}
		if(ans) cout<<-1<<endl;
		else cout<<s<<endl;
	}
	return 0;
}

B. Beautiful Numbers

鏈接

http://codeforces.com/contest/1265/problem/B

題意

給你一個排列,問你 1...n1...n 中哪幾個數是 Beautiful Numbers(在排列中截取一段 [l,r][l, r],使得這一段是一個排列,排列 1...m1...m 的最大數字 mm 就是 Beautiful Numbers)。

輸出一個字符串,如果第 ii 個數是 Beautiful Numbers,那麼第 ii 個字符是 ‘1’,否則是 ‘0’

思路

雙指針。

分析題目,可知 11 一定是 Beautiful Numbers

一個排列必然是需要 11 的,那麼先找到 11 的位置,兩個指針都指向 11 的位置。

對於每個數字都嘗試是否是 Beautiful Numbers

具體地,從 11 的位置開始擴展,每次向左或向右擴展 11 位,向左還是向右擴展取決於左右兩邊數字的大小,直觀上,先擴展小的數纔有可能找到一個排列。記錄每次所能得到的最大的連續數字,並當前數字相比較,如果相等,說明兩個指針中間的這段就是一個排列,當前數字是 Beautiful Numbers

PS:在我的實現中記錄目前是否得到這個數字的 flag[] 數組需要初始化到 n+1,因爲之後是通過判斷 flag[i] 是否是 00 來判斷連續的,如果受上次計算的影響 flag[n+1] 也是 11,那麼最後一次的最大連續數字將會變成 n+1n+1 所以一定要使得 flag[n+1] = 0。

AC代碼

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200100;

int t, n, a[MAXN], flag[MAXN]; 

int main(int argc, char const *argv[])
{
	cin>>t;
	while(t--) {
		cin>>n;
		int p, q;
		for (int i = 1; i <= n; ++i) {
			cin>>a[i];
			if(a[i] == 1) p = q = i;
		}
		for (int i = 0; i <= n+1; ++i) flag[i] = 0;
		flag[1] = 1;
		string ans = "1";
		int cnt = 1;
		for (int i = 2; i <= n; ++i) {
			if(p == 1) q++;
			else if(q == n) p--;
			else a[p-1] < a[q+1] ? p-- : q++;
			flag[a[q]] = 1;
			flag[a[p]] = 1;
			while(flag[cnt]) cnt++;
			cnt--;
			if(cnt == i) ans += "1";
			else ans += "0";
		}
		cout<<ans<<endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章