hey_left 13 Codeforces Round 849 (Div. 4)
A.
可用map标记这几个字符,判在不在即可
#include <bits/stdc++.h>
using namespace std;
string s="codeforces";
map<char,bool>mp;
void solve(){
char c;cin>>c;
if(mp[c]){
cout<<"YES"<<'\n';
}else cout<<"NO"<<'\n';
}
signed main(){
for(int i=0;i<s.size();i++)mp[s[i]]=true;
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}
B.
直接模拟,看经不经过(1,1)
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n;cin>>n;
string s;cin>>s;
int sx=0,sy=0;
for(int i=0;i<s.size();i++){
if(s[i]=='L')sx--;
else if(s[i]=='R')sx++;
else if(s[i]=='U')sy++;
else if(s[i]=='D')sy--;
if(sx==1&&sy==1){
cout<<"YES"<<'\n';
return ;
}
}
cout<<"NO"<<'\n';
}
signed main(){
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}
C.
用双指针模拟
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n;cin>>n;
string s;cin>>s;
if(s.size()==1){
cout<<1<<'\n';
return ;
}
for(int l=0,r=s.size()-1;l<=r;l++,r--){
if(s[l]=='0'&&s[r]=='1'||s[l]=='1'&&s[r]=='0')continue;
cout<<(r-l+1)<<'\n';
return ;
}
cout<<0<<'\n';
}
signed main(){
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}
D.
乍一看有点虎,经不起细看
求前缀后缀
然后遍历一遍取最大
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n;cin>>n;
string s;cin>>s;s=' '+s;
vector<int>pre(n+5),post(n+5);
map<char,bool>mp;
for(int i=1;i<s.size();i++){
if(mp[s[i]]){
pre[i]=pre[i-1];
continue;
}
mp[s[i]]=true;
pre[i]=pre[i-1]+1;
}
mp.clear();
for(int i=s.size()-1;i>=1;i--){
if(mp[s[i]]){
post[i]=post[i+1];
continue;
}
mp[s[i]]=true;
post[i]=post[i+1]+1;
}
int ma=0;
for(int i=2;i<=n;i++){
ma=max(ma,pre[i-1]+post[i]);
}
cout<<ma<<'\n';
}
signed main(){
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}
E.
dp,把每种情况都记录下来,取最大
dp[i][j]i表示到第i个数为止,最大的和,j表示上一个数变还是不变,0不变,1变
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]) + a[i];
不变,直接加上a[i]
dp[i][1] = max(dp[i - 1][0] - 2 * a[i - 1], dp[i - 1][1] + 2 * a[i - 1]) - a[i];
若选择变,讨论前一个数变或不变
若不变(说明到第i-1的和是按a[i-1]算的),所以-2a[i-1],算的就是i-1变的
若变了(说明到第i-1的和是按-a[i-1]算的),所以+2a[i-1],算的就是i-1变的
注意这里的变是相对于前i-1已经算好了(不管受不受i-2影响)
再考虑变不变
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n;cin>>n;
vector<int>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
vector<vector<int>>dp(n+1,vector<int>(2));
dp[1][0]=a[1];dp[1][1]=a[1];
for(int i=2;i<=n;i++){
if(i==2){
dp[i][0]=dp[i-1][0]+a[i];
dp[i][1]=-a[i-1]-a[i];
}else {
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]) + a[i];
//cout << "**********" << '\n';
//cout << dp[i - 1][0] << ' ' << dp[i - 1][1] << ' ' << dp[i][0] << '\n';
dp[i][1] = max(dp[i - 1][0] - 2 * a[i - 1], dp[i - 1][1] + 2 * a[i - 1]) - a[i];
//cout << dp[i - 1][0] - 2 * a[i] << ' ' << dp[i - 1][1] + 2 * a[i - 1] << ' ' << dp[i][1] << '\n';
}
}
int ans=max(dp[n][0],dp[n][1]);
cout<<ans<<'\n';
}
signed main(){
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}