[TIOJ] 1853 . Ch1-1.一切的開始

題目連結:http://tioj.infor.org/problems/1853
本題似乎有DP作法,狀態可能是什麼,強制把前i個都轉成0跟1的方法數。不過,其實也可以greedy做,準則是:從右邊面看到左邊時,若看到一個0,則看其左邊是否也為0,若是的話就用翻的,反之則用點的。因為對於一個XXXXX101111的序列,若在0那點用翻的,則會將下一個一變成0,那必定之後又要用翻的,最後會變成XXXXX111111,花費兩個操作,但是用點的只要一個操作;另外一方面,對於一個XXXXX001111,如果都用點的,需花費兩操作,但是如果用翻的最多也是兩操作,並不會比較慘。
#include <bits/stdc++.h>
using namespace std;
#define N 10000000

char arr[N+5];

int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);
	int n;cin>>n>>arr;
	int ans=0;
	bool cur=0;
	for(int i=n-1;i>=1;i--){
		if(arr[i]=='0'+cur){
			ans++;
			if(arr[i]==arr[i-1]) cur=!cur;
		}
	}
	if(arr[0]=='0'+cur) ans++;
	cout<<ans<<'\n';
	return 0;
}

留言

這個網誌中的熱門文章

[NPSC] 2009初賽 E. 檸檬汽水傳說

[TIOJ] 1902. 「殿仁.王,不認識,誰啊?」,然後他就死了……

[AtCoder] [經典競程 90 題] 024 - Select +/- One(★2)