B4022 [语言月赛 202408] 蓝色的网易云题解

前言

第一次写洛谷月赛题解啦。

入门水题,最简单的方法很没意思,这里就提供一种思路非常简单,但要借助队列解决的别样写法。

思路模拟

大致题意就是:给出 $n$ 个数据和 $m$ 个类型,每个数据会对应有且仅有一种类型,输出一种数据的排列顺序,需满足相邻的数据的类型不能一致

这里我们的思路就是,每输入一组 $n$ 与 c ,我们可以利用 pair 类型进行打包,在将打包好的数据推入一个队列。

然后写一个条件为队列不为空的循环,不断获取队列顶部数据的 nc,如果 c 与上一次输出的类型不同就输出后弹出队列,若相同则不输出就弹出后再推入队列。

这里问题就来了,我们如何得到上一次输出的类型呢???

其实也非常简单,我们只需要建立一个临时变量 last_{c} ,用于存储类型,再用 last_{c} 与 每次队列顶部的 c 进行对比就好了。

思路是不是很简单?如果还理解不了,咱直接上代码!!!

Code

拿到一个题我们先得输入,输入的代码很好理解,跟思路模拟非常相似。

ll n,m;
queue<pair<ll,ll>> que;
cin >> n >> m;
for(ll i = 1;i <= n;i++){
    ll t;
    cin >> t;
    que.push(make_pair(t,i));
}

接着我们写主体部分,也很好理解,就是对思路的代码模拟。

ll lastc;//存储上一次的c
while(!que.empty()){//遍历队列
    ll t = que.front().first;//队首c
    ll k = que.front().second;//队首n;
    que.pop();
    if(t != lastc){//若不相同则输出
        cout << k << endl;
        lastc = t;
        
    }else{//若相同则重新入队
        que.push(make_pair(t,k));
    }
}

给出完整代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
​
template<class T>
void read(T &res){
    bool flag=0;
    char ch;
    while((ch=getchar())<'0'||ch>'9') 
        if(ch=='-') flag=1;
    res=ch-'0';
    while((ch=getchar())>='0'&&ch<='9')
        res=(res<<1)+(res<<3)+(ch^48);
    if(flag) res=~res+1;
} 
template<class T>
void print(T x){
    if(!x) return ;
    print(x/10);
    putchar(x%10|48);
}
queue<pair<ll,ll>> que;
int main(){
    ll n,m;
    read(n);read(m);
    for(ll i = 1;i <= n;i++){
        ll t;
        read(t);
        que.push(make_pair(t,i));
    }
    ll lastc;
    while(!que.empty()){
        ll t = que.front().first;//队首c
        ll k = que.front().second;//队首n;
        que.pop();
        if(t != lastc){
            print(k);
            cout << endl;
            lastc = t;
            
        }else{
            que.push(make_pair(t,k));
        }
        
    }
    
    
    return 0;
}

那么就完结撒花啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值