原题链接
? ? ? ? 友友们,闲着没事儿,不要靠近cf,会变得不幸(bushi)
? ? ? ? 以上为本人,wa了n次以后的急躁发言,请忽略。
目录
1、题意分析
2、思路分析
3、AC代码
1、题意分析
? ? ? ?我们有t组数据的输入,每组数据的输入分为两行,第一行为这次需要进行特殊操作的珊瑚橘个数n,第二行为这n个数。
? ? ? ? 我们比较的规则是:每次输入的数字都和队首的数字比较。如果比队首的数字小,那么这个数就成为新的队首。如果比队首的数字小,那么这个数字就放到队尾,队首数字不变。当然,输入的第一个数字自动将其作为队首。
? ? ? ? 最后,再将这n个数字按排列好的顺序输出。
2、思路分析
? ? ? ? 因为每次小的数字都放在队首,最先会被输出。也就是说,越晚加到队首的数字会被越先输出。而每次大的数字都放在了队尾,最后被输出。也就是说,越晚放到队尾的数字会越晚被输出。
? ? ? ? 前者,刚好满足栈先进后出的原则,而后者,刚好满足队列先进先出的原则。(因为我还不会用双队列,这里也为友友们提供了双队列解法的传送门?这人表面萌新,实则大佬)
3、AC代码
#include <bits/stdc++.h>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
stack <ll> small;//小的数字
queue <ll> big;//大的数字
int main () {
ll b , n;//队首的 正在输入的
ll t , m;//总共的数据组数 每组数据的个数
scanf ("%lld" , &t);
for(ll i = 0 ; i < t ; i ++) {
scanf ("%lld" , &m);
for(ll j = 0 ; j < m ; j ++) {
scanf ("%lld" , &n);
if (j == 0) {
small.push (n);//输入的第一个数
b = n;
}
else {
if(n >= b) big.push (n);//如果输入的数比队首的数字大或者等于
else {
small.push (n);//如果输入的数比队首的数字小
b = n;//运算完以后,将此次输入的数赋给b,便于下一次的比较
}
}
}//输入完毕所有数字
ll c = 0;//方便判断是否需要输出空格
while (! small.empty()) {
if(c == 1)printf (" ");
printf ("%lld" , small.top());
small.pop();
c = 1;
}
while (! big.empty()) {
printf (" %lld" , big.front ());
big.pop();
}
printf ("\n");
}
return 0;
}
加油鸭,友友们!虽然我今天写这个题,给我心态整炸了,但我下次有机会还来。(手动秃头)
|