当前位置: 首页 > news >正文

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,然后最后将所有偶数加在最大的奇数上,那么答案便显而易见,ans=sum-ct1+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

思路

此题我写的O(n)的构造方法过于麻烦,这里仅供参考一下思路吧(代码太屎了看看就行)

首先如果此字符串中只有一种字符,或者三个字符数量相等特判输出结果

然后我们每次遇到含量不同后贪心的将其改成含量相同,如以下几种情况

然后我们发现在这个过程下现在只有最后有一串连续的相同的字符我们没法去处理,那么我们便单独拿到最后处理

关于这个最后的处理其实是有很多种情况的,大体分为两种

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;
}

相关文章:

  • pandas【9】数据合并concat/_append
  • 蓝桥云客 岛屿个数
  • Python if else while for 学习笔记
  • 基于Python的图书馆信息管理系统研发
  • 探寻性能优化:如何衡量?如何决策?
  • Cesium 全面介绍
  • 蓝桥与力扣刷题(34 在排序数组中查找元素的第一个和最后一个位置)
  • HTTP常见状态码分析
  • ICDE 2025[Tutorial]| 基于时间序列和时空数据的数据驱动决策
  • ArcGIS地理信息系统空间分析实验教程学习
  • [c语言日寄]通讯录pro版:文件操作
  • 知识体系_统计学_05_参数估计
  • 《无线江湖五绝:BLE/WiFi/ZigBee的频谱大战》
  • Pytorch学习笔记(十七)Image and Video - Adversarial Example Generation
  • Day 3 系统总线(1)
  • 未来环境生成助力具身导航!PanoGen++:基于领域自适应全景图像生成的视觉语言导航
  • DeepSeek+Kimi:PPT制作的效率革命
  • redis hashtable 的sizemask理解
  • 多线程 - 线程安全
  • QTreeView开发入门
  • 高端做网站价格/百度旗下所有app列表
  • wordpress显示10篇文章/企业网站seo托管怎么做
  • 网站建设公司固定ip/百度在线搜索
  • 做推广用那个网站吗/中国万网官网
  • 美声广告网站建设/最近社会热点新闻事件
  • 一个网址多少钱/seo推广有哪些