題解:CF2030C A TRUE Battle

lyfandlzf發表於2024-10-24

\(\texttt{Describe}\)

給一個長度為 \(n\) 的二進位制序列,Alice 和 Bob 在相鄰兩個0/1中間分別\(\operatorname{or}\)\(\operatorname{and}\) 操作,優先順序滿足 \(\operatorname{and} > \operatorname{or}\)

Alice 希望最後運算的值為 \(1\),Bob 希望它為 \(0\)

若雙方進行最優操作,問最後值為 \(0\)YES)還是 \(1\)NO)。

\(\texttt{Solution}\)

Hits 1: 觀察首尾性質

注意到當序列首是 \(1\) 的時候,只要 Alice 在後面加個 \(\operatorname{or}\),整個序列的值一定\(1\)

同理當序列尾是 \(1\) 的時候,值也為 \(1\)

另外,當序列出現了 \(\dots 11 \dots\) 的時候,Alice 一定可以構造出 \(\dots \operatorname{or} 1 \dots 1 \operatorname{or}\) 或者 \(\dots 1 \operatorname{or} 1 \operatorname{or} \dots\) 的形式使得整個序列為 \(1\)

判斷即可。

\(\texttt{Code}\)

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e5 + 10;

void solve() {
	int n; cin >> n;
	string s; cin >> s;
	if ((s.back() == '1' || s.front() == '1') || s.find("11") != s.npos) {
		cout << "YES\n";
	}else {
		cout << "NO\n";
	}
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
	
	int T; cin >> T; while (T --) solve();
	return 0;
}

相關文章