Codeforces Round 972(Div.2)题解
Codeforces Round 972(Div.2)题解
A. Simple Palindrome 贪心
贪心,尽可能元素数量平均,并且相同字母放在一起。
#include<bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;
typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 1;
void Showball(){
int n;
cin>>n;
const string a="aeiou";
int t=n/5;
vector<int> cnt(5,t);
for(int i=0;i<5;i++) if(i<n%5) cnt[i]++;
for(int i=0;i<5;i++){
while(cnt[i]--) cout<<a[i];
}
cout<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T=1;
if(cases) cin>>T;
while(T--)
Showball();
return 0;
}
B2. The Strict Teacher (Hard Version) 二分+贪心
首先,答案只和
中间的情况,因为两个老师同时向中间逼近,显然答案就是距离差值的一半。
void Showball(){
int n,m,q;
cin>>n>>m>>q;
vector<int> b(m);
for(int i=0;i<m;i++) cin>>b[i];
sort(all(b));
while(q--){
int x;
cin>>x;
auto p=lower_bound(all(b),x);
if(p==b.end()){
cout<<n-b[m-1]<<endl;
continue;
}
if(p==b.begin()){
cout<<b[0]-1<<endl;
continue;
}
cout<<(*p-*(p-1))/2<<endl;
}
}
C. Lazy Narek DP
首先考虑贪心,显然不行,因为两段字符串拼接到一起可以组成一段
考虑
不妨,我们令
状态转移:
可以状态压缩,这里需要避免更新的新状态又去更新了别的状态,因此,我们可以复制一份dp数组。
每次记录好得分后,直接更新即可。最后的答案需要减去匹配到的字符数量
void Showball(){
int n,m;
cin>>n>>m;
vector<string> a(n);
for(int i=0;i<n;i++) cin>>a[i];
const string s="narek";
vector<int> dp(5,-inf);
dp[0]=0;
for(int i=0;i<n;i++){
auto ndp=dp;
for(int j=0;j<5;j++){
int k=j;
int res=dp[j];
for(auto c:a[i]){
if(c==s[k]){
k++;
if(k==5){
k=0;
res+=5;
}
}else if(s.find(c)!=s.npos){
res--;
}
}
ndp[k]=max(ndp[k],res);
}
dp=ndp;
}
int ans=0;
for(int i=0;i<5;i++) ans=max(ans,dp[i]-i);
cout<<ans<<endl;
}
E1. Subtangle Game (Easy Version) 博弈+DP
不妨令
那么状态转移,我们倒着考虑,如果存在
否则,如果
可以通过该题。
void Showball(){
int l,n,m;
cin>>l>>n>>m;
vector<int> a(l+1);
for(int i=1;i<=l;i++) cin>>a[i];
vector<vector<int>> b(n+1,vector<int>(m+1));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>b[i][j];
}
}
vector<vector<vector<int>>> dp(l+2,vector<vector<int>>(n+2,vector<int>(m+2)));
for(int i=l;i;i--){
for(int j=n;j;j--){
for(int k=m;k;k--){
if(b[j][k]==a[i]&&!dp[i+1][j+1][k+1]) dp[i][j][k]=1;
dp[i][j][k]+=(dp[i][j+1][k]+dp[i][j][k+1]-dp[i][j+1][k+1]);
}
}
}
if(dp[1][1][1]) cout<<"T\n";
else cout<<"N\n";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】