洛谷P1155 双栈排序(贪心)
题意
Sol
首先不难想到一种贪心策略:能弹则弹,优先放A
然后xjb写了写发现只有\(40\),原因是存在需要决策的情况
比如
\(A = {10}\)
\(B = {8}\)
现在进来一个\(7\),看上去很难判断\(7\)到底放在哪里,如果放\(A\),后面来个\(9\),再来个\(6\),我们就凉了。
但是如果先来的是\(6\),且此时已经排完了\(1-5\),那么我们可以在后续操作中把\(7\)弄走
仔细想想不难发现,\(7\)不能放在\(A\)中,当且仅当存在一个位置\(K\),满足\(a[k]>7\),且在\(k\)之后有位置\(l\),满足\(a[l]<7\)
也就是说\(i, j, k\)不能同时在栈中,当且仅当
\(i < j < k\)且\(a[k] < a[i] < a[j]\)
然后就做完了,xjb贪即可
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define NO {puts("0"); exit(0);}
#define pb(x) push_back(x)
using namespace std;
const int MAXN = 1001;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, a[MAXN], s1[MAXN], tp1, s2[MAXN], tp2;
vector<char> v;
bool check(int pos) {
if(!tp1) return 1;
int i, j;
if(a[pos] > s1[tp1]) return 0;
if(!tp2) return 1;
for(i = pos + 1; i <= N; i++) if(a[i] > a[pos] && a[i] > s2[tp2]) break;
for(int j = i + 1; j <= N; j++) if(a[j] < a[pos]) return 0;
return 1;
}
int main() {
N = read();
for(int i = 1; i <= N; i++) a[i] = read();
int now = 1;
for(int i = 1; i <= N + 1; i++) {
if(a[i] == now) {now++; v.pb('a'); v.pb('b'); continue;}
while(now == s1[tp1] || now == s2[tp2]) {
if(now == s1[tp1]) v.pb('b'), tp1--, now++;
if(now == s2[tp2]) v.pb('d'), tp2--, now++;
}
if(i == N + 1) break;
if(check(i)) {v.pb('a'); s1[++tp1] = a[i]; continue;}
if(!tp2 || a[i] < s2[tp2]) {v.pb('c'); s2[++tp2] = a[i]; continue;}
NO;
}
if(tp1 || tp2) NO;
for(int i = 0; i < v.size(); i++) putchar(v[i]), putchar(' ');
return 0;
}
洛谷P1155 双栈排序(贪心)的更多相关文章
- 洛谷$P1155$ 双栈排序 贪心+二分图匹配
正解:贪心+二分图匹配 解题报告: 传送门$QwQ$ 跪了,,,我本来以为我$NOIp$做得差不多了,,,然后康了一眼发现没做多少啊其实$QAQ$ 然后来康题趴$QwQ$ 首先考虑如果只有一个栈的情况 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- [NOIP2008] 提高组 洛谷P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷——P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷P1155 双栈排序
这题什么毒瘤......之前看一直没思路,然后心说写个暴搜看能有多少分,然后就A了??! 题意:给你一个n排列,求它们能不能通过双栈来完成排序.如果能输出最小字典序方案. [update]这里面加了一 ...
- 洛谷P1155 双栈排序——思路题
题目:https://www.luogu.org/problemnew/show/P1155 思路... 看博客:https://www.cnblogs.com/Narh/p/9213825.html ...
- 洛谷 P1155 双栈排序
题面 解题思路 这道题乍一看还以为是个模拟..怒写一发30分(noip提高组t4有模拟吗?). 其实很好hack,如 10 10 2 8 1 7 9 3 4 5 6 按模拟的思路,应该是10入第一个栈 ...
- P1155 双栈排序(二分图染色)
P1155 双栈排序(二分图染色) 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一 ...
- vijos 1605 双栈排序 - 贪心 - 二分图
题目传送门 传送门I 传送门II 题目大意 双栈排序,问最小字典序操作序列. 不能发现两个数$a_{j}, a_{k}\ \ (j < k)$不能放在同一个栈的充分必要条件时存在一个$i$使得$ ...
随机推荐
- IOS面试题(一)
第一次写博客,我在这里先给大家分享一些iOS中常见的面试题吧! 1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: ...
- P4098 [HEOI2013]ALO 可持久化01Trie
$ \color{#0066ff}{ 题目描述 }$ Welcome to ALO ( Arithmetic and Logistic Online).这是一个 VR MMORPG, 如名字所见,到处 ...
- To 高一
Linux 坑待填 Special Judge 什么是 Special Judge?有的题目会让你输出任意一个解即可AC,或者是让你输出部分答案能取得本测试点部分得分,或者是按照方案的优秀程度给你分, ...
- 你不可不知的数据库northwind
说起northwind,40左右的大年一定不会陌生,它是著名的northwind示例库,在SQL Server 是标配. 它有8张表,涉及客户.商品.订单. 如果你是有志从事企业级应用开发,或有志从事 ...
- 【http协议】浅谈
[http协议]浅谈 一. 概述 http,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议. 请求与响应: 客户端发送请求,服务器端响应数 ...
- python之类与对象(2)
3. 类函数的进阶 3.1 类函数调用类属性 关于类函数调用类属性,我们尝试修改前一节的内容,以我们在之前学习的内容,调用属性直接用%+属性就可以了,那我们来试一下: 看到了程序有报错,这其实是因为在 ...
- Bi-shoe and Phi-shoe(欧拉筛)
Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popular co ...
- spring切面拦截实现
1.建立业务类(英雄战斗实现类) package com.g2.api; public interface Weapon { int attack(); String getName(); } pac ...
- css3 实现 tooltip
/* START TOOLTIP STYLES */ [tooltip] { position: relative; /* opinion 1 */ } /* Applies to all toolt ...
- spring的总结
1. 第一天 问题:怎样的程序是一个优秀的程序 可维护性好,可扩展性好,性能优秀 问题:业界对象提供什么的概念 高内聚,低耦合,也就是尽量使代码对应的功能写在对应的模块,并且尽量减少类与类之间的关系, ...