原题目

  某大厦共有 N 层,现在知道共有 K 个请求要上下电梯;下面告诉你每个请求乘电梯的出发层次和结 束层次。请你求出整个电梯的运行过程。假设电梯一开始停在第一层,运行 K 个请求最后回到第一层。

  例如有个 9 个层次的电梯,共接收到 5 个请求。

  1 5(表示要求从 1 层到 5 层)

  4 2

  2 8

  6 9

  5 1

  那么电梯的运行路线为:1-2-5-6-8-9-5-4-2-1

  第一行为 N 和 K; 后面每行两个整数 x y 表示 K 个请求,每个请求保证合理.且肯定有请求从第一层出发,也肯定有请求 回到第一层结束。但不一定能够达到最高层,数据保证解的唯一性。

  电梯的运行过程,要求从第一层开始,最后回到第一层,每两个数据之间用"-"间隔,行首和行末不要 有多余的"-"("-"为减号)。

S1:

  Input:


  Output:

1---------1

  


  Describe:

  code:

#include<bits/stdc++.h>
#define INF 214748364
#define eps 1e-9
#define rep1(a,b) for(register int i=(a);i<=(b);i++)
#define rep2(a,b) for(register int j=(a);j<=(b);j++)
using namespace std;
int n,k,ii=1,tot,maxx=-1;
int tp[1000111],f[1000101];
struct BDF{
int l,r;
bool wy;
}a[1001001];
inline bool cmp(BDF a,BDF b){
if(a.wy!=b.wy)return a.wy>b.wy;
else if(!a.wy)return a.l>b.l;
else return a.l<b.l;
}
inline int read(){
int ret=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-f;ch=getchar();}
while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}
inline double read2(){
double X=0,Y=1.0;int w=0;char ch=0;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=X*10+(ch^48),ch=getchar();
ch=getchar();
while(isdigit(ch)) X+=(Y/=10)*(ch^48),ch=getchar();
return w?-X:X;
}
inline void write(int x){
if(x<0){putchar('-');write(-x);return;}
if(x/10) write(x/10);
putchar(x%10+'0');
}
int main(){
freopen("lift.in","r",stdin);
freopen("lift.in","w",stdout);
n=read(),k=read();
for(int i=1;i<=k;i++) //分类成上行和下行讨论
{
a[i].l=read();
a[i].r=read();
if(a[i].l<a[i].r)a[i].wy=1;
else a[i].wy=0;
}
sort(a+1,a+k+1,cmp);
// for(int i=1;i<=n;i++)
// cout<<a[i].l<<' '<<a[i].r<<' ';
while(a[ii].wy&&ii<=k){ //上行桶排
tp[a[ii].l]++;
tp[a[ii].r]++;
maxx=max(maxx,a[ii].r); //存储上行终点
ii++;
}
for(int i=1;i<=100000;i++) //导入数组
if(tp[i])f[++tot]=i;
ii=k; memset(tp,0,sizeof(tp)); while(!a[ii].wy&&ii>=1){ //下行桶排
tp[a[ii].l]++;
tp[a[ii].r]++;
if(a[ii].l>maxx)maxx=-1; //数据有锅,不加这句话AC,但理论上应该特判 (若上行终点不是下行起点且比下行起点低,如果下行也有上行终点相同楼层也要输出,但数据不特判)
ii--;
}
for(int i=100000;i>=1;i--) //导入数组
if(tp[i]&&i!=maxx)f[++tot]=i; //特判
for(int i=1;i<=tot-1;i++)
cout<<f[i]<<"-";
cout<<f[tot];return 0;
return 0;
}

最新文章

  1. 电脑桌面 IE 图标删除不了的解决方法
  2. Factory 模式
  3. 在为ListView设置adapter时出错
  4. expect结合ssh遍历线上机器
  5. 【LeetCode】257. Binary Tree Paths
  6. poj 1005 I Think I Need a Houseboat
  7. BZOJ 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏
  8. VMware网络模式介绍(下篇)
  9. oracle查询语句中case when的使用
  10. 字符串匹配算法 之 基于DFA(确定性有限自动机)
  11. YiShop_如何选择B2C商城开发商
  12. Java中的集合框架(上)
  13. Apache Shiro 核心概念
  14. 查看Oracle中存储过程长时间被卡住的原因
  15. [Abp 源码分析]九、事件总线
  16. .Net Core 在 Linux-Centos上的部署实战教程(二)
  17. SAS语言结构
  18. iOS视频开发经验
  19. msfvenom生成linux后门
  20. 虚拟机zookeeper和hbase集群搭建

热门文章

  1. 执行SQL时出现: ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  2. 【项目】小试牛刀-polo360静态网页项目(附psd文件资源)
  3. 2.分析Ajax请求并抓取今日头条街拍美图
  4. Centos7 nginx 反向代理的配置
  5. 卸载sql server 2008
  6. iOS10打电话、发短信、发邮件等小功能
  7. list的三个子类的特点
  8. python语言入门
  9. vue dialog每次打开会展示上一次数据(转载)
  10. PaperReading20200223