前言
第一次写洛谷月赛题解啦。
入门水题,最简单的方法很没意思,这里就提供一种思路非常简单,但要借助队列解决的别样写法。
思路模拟
大致题意就是:给出 个数据和 个类型,每个数据会对应有且仅有一种类型,输出一种数据的排列顺序,需满足相邻的数据的类型不能一致。
这里我们的思路就是,每输入一组 与 ,我们可以利用 pair 类型进行打包,在将打包好的数据推入一个队列。
然后写一个条件为队列不为空的循环,不断获取队列顶部数据的 和 ,如果 与上一次输出的类型不同就输出后弹出队列,若相同则不输出就弹出后再推入队列。
这里问题就来了,我们如何得到上一次输出的类型呢???
其实也非常简单,我们只需要建立一个临时变量 ,用于存储类型,再用 与 每次队列顶部的 进行对比就好了。
思路是不是很简单?如果还理解不了,咱直接上代码!!!
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;
}
那么就完结撒花啦。