【CodeForces訓練記錄VP】Codeforces Round 933 (Div. 3)

MNNUACM_2024ZY發表於2024-10-25

https://codeforces.com/contest/1941

訓練情況

50min後罰坐

反思

C題剛開始思路錯了,以為是刪字串最後面,然後漏考慮掉兩字串部分拼接的情況

A題

直接模擬,求 \(a_i + b_j \le k\) 的對數。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n,m,k; cin>>n>>m>>k;
	vector<int> a(n + 1);
	vector<int> b(m + 1);
	for(int i = 1;i<=n;i++) cin>>a[i];
	for(int i = 1;i<=m;i++) cin>>b[i];
	int ans = 0;
	for(int i = 1;i<=n;i++){
		for(int j = 1;j<=m;j++){
			if(a[i] + b[j] <= k) ans++;
		}
	}
	cout<<ans<<endl;
}

signed main(){
	int T; cin>>T; while(T--)
	solve();
	return 0;
}

B題

我們考慮倒著思考,如果陣列能最後刪成全零,那它一定是由若干個 \([1,2,1]\) 這樣子加起來的,所以我們就可以從左往右貪心,能刪掉的儘量刪掉,如果最後剩下的數不是 \(0\),答案就是 NO,否則就是 YES。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n; cin>>n;
	vector<int> a(n + 3);
	for(int i = 1;i<=n;i++) cin>>a[i];
	for(int i = 1;i<=n;i++){
		if(a[i] > 1){
			int mi = min(a[i - 1],a[i + 1]);
			a[i-1] -= mi;
			a[i+1] -= mi;
			a[i] -= mi*2;
		}
	}
	bool flag = true;
	for(int i = 1;i<=n;i++) if(a[i]) flag = false;
	if(flag) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
}

signed main(){
	int T; cin>>T; while(T--)
	solve();
	return 0;
}

C題

我們發現想讓子串 piemap 消失,我們肯定考慮要刪中間的那個字元,比如 ppppieeee 這種,顯然只能刪中間的字元,刪頭尾的兩個字元反而操作次數更多,所以對於每個 piemap 只需要操作一次,把中間的字元刪掉,然後我們只需要統計 piemap 子串出現的次數即可,注意一下子串匹配到了指標要往下跳

hack資料

mapie

答案是 \(1\),刪掉 p 即可

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n; cin>>n;
	string s; cin>>s;
	int ans = 0;
	for(int i = 0;i<n - 2;i++){
		string ss = s.substr(i,3);
		if(ss == "map" || ss == "pie") ans++,i+=2;
	}
	cout<<ans<<endl;
}

signed main(){
	int T; cin>>T; while(T--)
	solve();
	return 0;
}

D題

我們發現最後要輸出可能的人數,並且人的編號要單調遞增,容易想到使用 set 集合來維護,所以我們只要一輪一輪的維護,每一輪將上一輪可能接到球的人取出來模擬即可,如果為 ? 則順時針和逆時針都跑一遍,注意一下順時針和逆時針的環,減一取模加一即可。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n,m,x; cin>>n>>m>>x;
	set<int> ans;
	ans.insert(x);
	for(int i = 1;i<=m;i++){
		set<int> se;
		int c; string s;
		cin>>c>>s;
		if(s == "0") for(auto j:ans) se.insert((j+c-1)%n+1);
		else if(s == "1") for(auto j:ans) se.insert((n+j-c-1)%n+1);
		else if(s == "?"){
			for(auto j:ans) se.insert((j+c-1)%n+1);
			for(auto j:ans) se.insert((n+j-c-1)%n+1);
		}
		ans = se;
	}	
	cout<<ans.size()<<endl;
	for(auto i:ans) cout<<i<<" ";
	cout<<endl;
}

signed main(){
	int T; cin>>T; while(T--)
	solve();
	return 0;
}

相關文章