1. 程式人生 > 其它 >B. Bit Flipping_二進位制貪心

B. Bit Flipping_二進位制貪心

B. Bit Flipping

題目大意:

對一個長度為n的01串,可以進行m次整串翻轉,每一次翻轉時可以指定任意一個位置使其不變。現在要求出m次操作後字典序最大的一個串,並且輸出每個位置被指定了幾次。

思路和程式碼:

這應該是這一場裡最簡單的一題了8

首先,全域性考慮一下可以發現,如果沒有指定不變操作那麼每一位都要被翻轉m次。若指定i位k次,則i位翻轉m-k次。我們要的是字典序最大,那麼就可以從左往右一位一位考慮,每次儘可能使該位變成1。

走完後若運算元還有剩下,則儘量使得剩下的操作無效化。就是剩餘運算元中的最大偶數次指定操作放到我們已經操作過的地方。

若還有剩餘則改變第n位(這樣改變最小)

void solve(){
	cin >> n >> m ;
	string s ;
	cin >> s ;
	s = " " + s ;
	vct<bool> ans(n + 1 , 0) ;
	vct<int > tms(n + 1 , 0) ;
	
	int num = m ;
	
	rep(i , 1 , n){
		bool now ;
		if(s[i] == '1' && m % 2 == 0 || s[i] == '0' && m % 2) ans[i] = now = 1 ;
		else now = 0 ;
		if(now) continue ;
		if(num < 1) continue ;
		num -- ;
		ans[i] = 1 ;
		tms[i] ++ ;
	}
	if(num > 0){
		rep(i , 1 , n){
			if(tms[i] > 0){
				tms[i] += num / 2 * 2 ;
				num %= 2 ;
				break ;
			}
		}
		if(num > 0){
			tms[n] += num ;
			if((m - tms[n]) & 1) ans[n] = s[n] == '1' ? 0 : 1 ;
			else ans[n] = s[n] - '0' ;
		}
		
	}
	rep(i , 1 , n) cout << ans[i] ; cout << "\n" ;
	rep(i , 1 , n) cout << tms[i] << " " ; cout << "\n" ;
}//code_by_tyrii 

小結:

比較簡單的貪心