感觉这场的题都挺傻逼的
写一下题解
A
17 71就是两位数的素数
void solve(){
string s;cin>>s;
for(auto c:s){
if(c=='1'||c=='7')cout<<c;
}cout<<endl;
}
B
注意到第一位必然是0 最后一位必然是1
那我们就找一个间隙左边是0 0相等右边是1 1相等即可
否则一定做不到
void solve(){
// 01001
// 01110
string a,b;cin>>a>>b;
for(int i=0;i+1<a.size();i++){
if(a[i]==b[i]&&a[i]=='0'&&a[i+1]==b[i+1]&&b[i+1]=='1'){
cout<<"YES"<<endl;
return;
}
}
cout<<"NO"<<endl;
}
C
偷了个数据 发现不对齐其实可以有很多个
那我们维护四个操作即可 有点麻烦
- 就维护 len即可
- 得维护 减掉不对齐的位置没 对齐的位置得取min
0 插入一个不对齐的位置 并且要判断 对齐的位置是不是小于当前
1 max当前对齐位置 并且不得有不对齐位置
void solve() {
string s;
cin >> s;
int g = 0, len = 0; //
set<int>b;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '+') {
len++;
} else if (s[i] == '-') {
len--;
while(b.size()&&*b.rbegin()>len)b.erase(*b.rbegin());
g = min(g, len);
} else if (s[i] == '0') {
if (g < len) {
b.insert(len);
if (len <= 1) {
NO
return;
}
} else {
NO
return;
}
} else if (s[i] == '1') {
if (b.size()) {
NO
return;
}
g = max(len, g);
}
}
YES
}
D
发现全都是正整数
但是操作可以负数
要是只能整数
那么就是我们有多少个ai >= a[i+1]
要是只能负数
那么就是数有多少个 ai <= a[i+1]
我们知道要变成一个升序 显然只能前面负数 后面*正数这样
那我们枚举那个点前面是负数 后面是正数
发现可以O1转移
void solve() {
int n;cin>>n;
vector<int>a(n+1);
int pre=0,suf=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(i&&a[i-1]>=a[i])suf++;
}
int ans=suf;
for(int i=1;i<n;i++){
if(a[i]>=a[i-1])pre++;
if(a[i]>=a[i+1])suf--;
ans=min(ans,pre+suf);
}
cout<<ans<<endl;
}
标签:suf,154,int,void,len,++,EDU,对齐
From: https://www.cnblogs.com/ycllz/p/17904885.html