A题

本题根据题意模拟能解,不排除更好的做法


Codeforces Round #604 题解_i++Codeforces Round #604 题解_i++_02


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int main(){
int t;
cin>>t;
while(t--){
string s;
cin>>s;
int i;
int flag=1;
for(i=0;i<s.size()-1;i++){
if(s[i]==s[i+1]&&s[i]!='?'&&s[i+1]!='?'){
cout<<-1<<endl;
flag=0;
break;
}
}
if(!flag)
continue;
int a=s.size()-1;
if(a==0){
cout<<"a"<<endl;
continue;
}
for(i=0;i<s.size()-1;i++){
if(s[i]=='?'&&s[i+1]!='?'){
if(i==0){
if(s[i+1]=='a')
s[i]='b';
if(s[i+1]=='b')
s[i]='c';
if(s[i+1]=='c')
s[i]='a';
}
else{
if(s[i-1]!=s[i+1])
s[i]=('a'+'b'+'c'-s[i+1]-s[i-1]);
else{
if(s[i+1]=='a')
s[i]='b';
if(s[i+1]=='b')
s[i]='c';
if(s[i+1]=='c')
s[i]='a';
}
}
}
else if(s[i]=='?'&&s[i+1]=='?'){
if(i==0)
s[i]='a';
else{
if(s[i-1]=='a')
s[i]='b';
if(s[i-1]=='b')
s[i]='c';
if(s[i-1]=='c')
s[i]='a';
}
}
}

if(s[a]=='?'){
if(s[i-1]=='a')
s[i]='b';
if(s[i-1]=='b')
s[i]='c';
if(s[i-1]=='c')
s[i]='a';
}
cout<<s<<endl;
}
}

View Code

B题

我们能够发现,只需要关注位置关系就能求解本题,所以我们设计一个pos数组记录每个值他的位置在哪

我们可以从1开始遍历到n,然后设计两个变量维护左右边界


Codeforces Round #604 题解_i++Codeforces Round #604 题解_i++_02


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int main(){
int t;
cin>>t;
int a[N];
int pos[N];
while(t--){
int n;
cin>>n;
int i,j;
for(i=1;i<=n;i++){
cin>>a[i];
pos[a[i]]=i;
}
int l=pos[1];
int r=pos[1];
for(i=1;i<=n;i++){
l=min(pos[i],l);
r=max(pos[i],r);
if(r-l+1==i)
cout<<1;
else
cout<<0;
}
cout<<endl;
}
}

View Code

C题

贪心题目,金牌越多越好,然后银牌只需要比金牌大,其他控制铜牌就可以,因为其他情况需要满足更多的条件

我们求取的是最大的奖牌数。


Codeforces Round #604 题解_i++Codeforces Round #604 题解_i++_02


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
const int N=2e5+10;
map<int,int> m1;
int main(){
int t;
cin>>t;
while(t--){
m1.clear();
int n;
int i;
cin>>n;
int h;
for(i=1;i<=n;i++){
cin>>h;
m1[-h]++;
}
if(m1.size()<3){
cout<<"0 0 0"<<endl;
continue;
}
int g=0;
int s=0;
int b=0;
int flag=0;
for(auto x:m1){
if(flag==0){
if(g+s+b+x.second>n/2)
break;
g=x.second;
flag++;
}
else if(flag==1){
if(g+s+b+x.second>n/2)
break;
s+=x.second;
if(s>g)
flag++;
}
else{
if(g+s+b+x.second>n/2)
break;
b+=x.second;
}
}
if(g==0||s==0||b==0)
cout<<"0 0 0"<<endl;
else if(g>=s||g>=b)
cout<<"0 0 0"<<endl;
else
cout<<g<<" "<<s<<" "<<b<<endl;
}
}

View Code

 


没有人不辛苦,只有人不喊疼