Codeforces Round 1014 (Div. 2)(A-D)
题目链接:Dashboard - Codeforces Round 1014 (Div. 2) - Codeforces
A. Kamilka and the Sheep
思路
最大值-最小值
代码
void solve(){
int n;
cin>>n;
vi a(n+10);
int mx=0;
int mi=inf;
for(int i=1;i<=n;i++){
cin>>a[i];
mi=min(mi,a[i]);
mx=max(mx,a[i]);
}
cout<<mx-mi<<"\n";
}
B. Lady Bug
思路
可以发现我们能把这两串01串分成如上的两组,其中在每组中是任意交换的,所以我们只需要保证每一组的0的数量都>=n/2即可
代码
void solve(){
int n;
cin>>n;
string a,b;
cin>>a>>b;
a=" "+a;
b=" "+b;
int ct1_0=0;
int ct2_0=0;
for(int i=1;i<=n;i++){
if(i%2){
if(a[i]=='0'){
ct1_0++;
}
if(b[i]=='0'){
ct2_0++;
}
}else{
if(a[i]=='0'){
ct2_0++;
}
if(b[i]=='0'){
ct1_0++;
}
}
}
if((ct1_0>=(n+1)/2)&&(ct2_0>=n/2)){
cout<<"YES\n";
}else{
cout<<"NO\n";
}
}
C. Asuna and the Mosquitoes
思路
通过对于样例的推导,我们发现如果在有偶数的情况下,我们可以将偶数变大奇数转化成1,然后最后将所有偶数加在最大的奇数上,那么答案便显而易见,,ct1是奇数的数量
代码
void solve(){
int n;
cin>>n;
int sum=0;
int mx=0;
int ct0=0,ct1=0;
for(int i=1;i<=n;i++){
int x;cin>>x;
if(x%2) ct1++;
else ct0++;
sum+=x;
mx=max(mx,x);
}
if(ct0==0||ct1==0){
cout<<mx<<"\n";return;
}
sum-=ct1;
cout<<sum+1<<"\n";
}
D. Mishkin Energizer
思路
此题我写的的构造方法过于麻烦,这里仅供参考一下思路吧(代码太屎了看看就行)
首先如果此字符串中只有一种字符,或者三个字符数量相等特判输出结果
然后我们每次遇到含量不同后贪心的将其改成含量相同,如以下几种情况
然后我们发现在这个过程下现在只有最后有一串连续的相同的字符我们没法去处理,那么我们便单独拿到最后处理
关于这个最后的处理其实是有很多种情况的,大体分为两种
1.在前面构造的过程中我们没有占用最后连续相同串的第一个字符如下情况构造
2.我们占用了第一个字符,这里又分为两种情况构造
-1我们最后的连续相同串的前面的第二个字符与这连续的串是相同的,我们便以这个字符为i构造便能平衡出来
-2不同的情况我们需要先把前面变出个与最后字符串相同的情况,然后再以这个为i再平衡
这样就把所有情况考虑了一遍,当然在实现过程中还涉及id的维护等等,反正调起来很麻烦,还是用官方题解做吧,这里只是参考
代码
#include<bits/stdc++.h>
using namespace std;
#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;
const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;
void solve(){
int n;cin>>n;
string s;
cin>>s;
s=" "+s;
int x,y,z;
x=y=z=0;
for(int i=1;i<=n;i++){
if(s[i]=='I') x++;
if(s[i]=='T') y++;
if(s[i]=='L') z++;
}
if((x==0&&y==0)||((x==0&&z==0))||(y==0&&z==0)){
cout<<"-1\n";return;
}
if(x==y&&y==z){
cout<<"0\n";return;
}
char ch='0'; //记录的是最后连续相同串的前面第2个字符
vi ans;
int ct=0;
int i=1;
bool f=false;
int id=0;
int num=0;
bool b=false;
while(i<=n){
if(i==n){ //特判i==n的情况
if(s[i]==s[i-1]){ //最后有连续的两个字符
f=true;
id=i+ct;
num=2;
}else{ //字符单独和前面不同
ans.push_back(i-1+ct);
ans.push_back(i+ct);
}
break;
}
if(s[i]!=s[i+1]){
ans.push_back(i+ct);
if((s[i]=='T'&&s[i+1]=='I')||(s[i]=='I'&&s[i+1]=='T')) ch='L';
if((s[i]=='T'&&s[i+1]=='L')||(s[i]=='L'&&s[i+1]=='T')) ch='I';
if((s[i]=='L'&&s[i+1]=='I')||(s[i]=='I'&&s[i+1]=='L')) ch='T';
ct++;
i+=2;
}else{
int t=i;
while(t<=n&&s[t]==s[i]){
t++;
}
if(t==n+1){
if(s[i]==s[i-1]){ //之前的构造占用了最后连续字符的第一个字符
id=i+ct;
num=n-i+2;
f=true;
break;
}else{
id=i+ct;
num=n-i+1;
b=true;
f=true;
break;
}
}
ch=s[t];
int cnt=t-i;
t--;
for(int j=1;j<=2*cnt-1;j++){
ans.push_back(t+ct);
}
ct+=(2*cnt-1);
i=t+2;
}
}
if(f){
if(b){
ans.push_back(id-1);
ans.push_back(id-1);
for(int i=1;i<=2*(num+1)-1;i++){
ans.push_back(id);
}
}else{
if(ch!=s[n]){
ans.push_back(id-3);
for(int i=1;i<=2*num;i++){
ans.push_back(id-2);
}
}else{
for(int i=1;i<=2*(num-1);i++){
ans.push_back(id-3);
}
}
}
}
cout<<ans.size()<<"\n";
for(auto x:ans){
cout<<x<<"\n";
}
}
signed main() {
vcoistnt
cout<<fixed<<setprecision(2);
int _=1;
cin>>_;
while(_--) solve();
return 0;
}