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