UVALive 3959 Rectangular Polygons (排序贪心)
Rectangular Polygons
题目链接:
http://acm.hust.edu.cn/vjudge/contest/129733#problem/G
Description
In this problem, we will help the Faculty of Civil Engineering. They need a software to analyze ground plans of buildings. Specifically, your task is to detect outlines of a building when all of its corners are given.
You may assume that each building is a rectangular polygon with each of its sides being parallel either with X or Y axis. Therefore, each of its vertex angles is exactly either 90 or 270 degrees.
Input
The input contains several buildings. The description of each building starts with a single positive integer N , the number of corners (polygon vertices), 1
Output
For each building, output one line containing N characters without any whitespace between them. The characters should be uppercase letters that specify directions of individual walls (sides) when the building outline is followed. " N" stands for North (the positive direction of the Y axis), `` E" for East (the positive direction of the X axis), "W" for West, and " S" for South. The "walk" should start in the vertex that has been given first in the input and always proceed in the clockwise direction.
Sample Input
4
0 0
2 2
0 2
2 0
6
1 1
2 2
0 1
1 0
0 2
2 0
0
Sample Output
NESW
WNESWN
Source
2016-HUST-线下组队赛-2
##题意:
给出平面上N个点,构造一个每条边都平行于轴的多边形.
从起点#1开始顺时针输出行进方向.
##题解:
观察结果图形:所有边一定平行轴. 那么对于y坐标相同的若干点#1~#m,有若干推论:(均可以反证)
首先,m的一定是偶数,否者多出来的点不能正常连边.
然后,这m个点一定有 m/2 条边,否则剩下的边不能正常连边.
最后,这m个点的连边方式一定是:(1,2),(3,4)...(m-1,m),否则会出现交叉或多余点.
对于x坐标相同的点也是如此.
对所有点按x为第一优先级排序后,可以将所有竖边连起来;同理得到所有横边.
现在已经得到关于最后结果的图模型,问题是怎么按要求输出:
直接按从#1开始或许有点麻烦,这里可以从最左上角的点开始往右走,这样保证了输出的轨迹一定是顺时针.
当遍历到#1时才开始输出,计数n次输出即结束. 所以最多遍历2次.
这题瞎搞了两小时,写了160+行结果TLE... 赛时想得太复杂,各种xjb删点删边瞎搞一通.
今天真是打得太挫了,2个小时写两题,后面的时间都在搞一个题. 两个人搞还是有点蛋疼,有几道比较简单的题都没开.
##代码:
``` cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define eps 1e-8
#define maxn 1010
#define mod 100000007
#define inf 0x3f3f3f3f
#define mid(a,b) ((a+b)>>1)
#define IN freopen("in.txt","r",stdin);
using namespace std;
int n;
struct Point {
int id;
int x, y;
}p[maxn];
int g[maxn][4];
bool cmp1(Point a, Point b) {
if(a.y == b.y) return a.x < b.x;
return a.y < b.y;
}
bool cmp2(Point a, Point b) {
if(a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
int main(int argc, char const *argv[])
{
//IN;
while(scanf("%d", &n) != EOF && n)
{
memset(g, 0, sizeof(g));
int cur = 0, cx = inf, cy = -inf; //top-left most
for(int i=1; i<=n; i++) {
scanf("%d %d", &p[i].x,&p[i].y);
p[i].id = i;
if(p[i].y > cy) cx = p[i].x, cy = p[i].y, cur = i;
if(p[i].y == cy && p[i].x < cx) cx = p[i].x, cur = i;
}
sort(p+1, p+1+n, cmp1);
for(int i=1; i<=n; i+=2) {
g[p[i].id][1] = p[i+1].id;
g[p[i+1].id][3] = p[i].id;
}
sort(p+1, p+1+n, cmp2);
for(int i=1; i<=n; i+=2) {
g[p[i].id][0] = p[i+1].id;
g[p[i+1].id][2] = p[i].id;
}
int order = 0;
bool flag = 0;
int cnt = 0;
while(1) {
if(cur == 1) flag = 1;
char ans = 0;
int tmp = cur;
if(!order) {
if(g[tmp][1]) cur = g[tmp][1], ans = 'E';
if(g[tmp][3]) cur = g[tmp][3], ans = 'W';
} else {
if(g[tmp][0]) cur = g[tmp][0], ans = 'N';
if(g[tmp][2]) cur = g[tmp][2], ans = 'S';
}
order = !order;
if(flag) putchar(ans), cnt++;
if(cnt >= n) break;
}
putchar('\n');
}
return 0;
}
UVALive 3959 Rectangular Polygons (排序贪心)的更多相关文章
- BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心
BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜 ...
- CodeForces 1294B Collecting Packages(排序+贪心)
http://codeforces.com/contest/1294/problem/B 大致题意: 一张图上有n个包裹,给出他们的坐标,一个机器人从(0,0)出发,只能向右(R)或向上(U),问能否 ...
- POJ3687 Labeling Balls(拓扑排序\贪心+Floyd)
题目是要给n个重量1到n的球编号,有一些约束条件:编号A的球重量要小于编号B的重量,最后就是要输出字典序最小的从1到n各个编号的球的重量. 正向拓扑排序,取最小编号给最小编号是不行的,不举出个例子真的 ...
- poj1456 结构体排序+贪心
题意:给出很多商品,每个商品有价值和出售期限,只能在期限内出售才能获取利润,每一个单位时间只能出售一种商品,问最多能获得多少利润. 只需要按照优先价值大的,其次时间长的排序所有物品,然后贪心选择,从它 ...
- poj-2376 Cleaning Shifts (排序+贪心)
http://poj.org/problem?id=2376 john有n头牛做打扫工作,他想在t时间内每个时间都至少有一头牛在做打扫工作,第一头牛在1,最后一头牛在t时间,每一头牛工作都有一个开始时 ...
- UVaLive 6609 Meeting Room Arrangement (贪心,区间不相交)
题意:给定 n 个区间,让你选出最多的区间,使得每个区间不相交. 析:贪心题,贪心策略是按右端点排序,然后按着选即可. 代码如下: #pragma comment(linker, "/STA ...
- vijos 1605 双栈排序 - 贪心 - 二分图
题目传送门 传送门I 传送门II 题目大意 双栈排序,问最小字典序操作序列. 不能发现两个数$a_{j}, a_{k}\ \ (j < k)$不能放在同一个栈的充分必要条件时存在一个$i$使得$ ...
- 2019.01.20 bzoj5158 Alice&Bob(拓扑排序+贪心)
传送门 短代码简单题. 题意简述:对于一个序列XXX,定义其两个伴随序列a,ba,ba,b,aia_iai表示以第iii个数结尾的最长上升子序列长度,bib_ibi表示以第iii个数开头的最长下降 ...
- HDU 4857 逃生(反向建边的拓扑排序+贪心思想)
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
随机推荐
- UNIX / Linux: 2 Ways to Add Swap Space Using dd, mkswap and swapon
UNIX / Linux: 2 Ways to Add Swap Space Using dd, mkswap and swapon by RAMESH NATARAJAN on AUGUST 18, ...
- duilib库分析: 消息流程分析
转 看下CWindowWnd类与CPaintManagerUI类是咋进行消息分发的吧. 1. 先看下CPaintManagerUI类的MessageLoop函数: void CPaintManag ...
- 使用mysql索引的规则
注意事项: 1)索引并不是越多越好 创建索引是会占用非常多的硬盘空间的,一般来说,一张表的索引的大小是其数据大小的2到3倍: 所以不要随便创建无用的索引,一般来说,只要给学用来做条件(where.or ...
- POJ 2084 Game of Connections
卡特兰数. #include<stdio.h> #include<string.h> ; ; void mul(__int64 a[],int len,int b) { int ...
- UVA 11374 Halum (差分约束系统,最短路)
题意:给定一个带权有向图,每次你可以选择一个结点v 和整数d ,把所有以v为终点的边权值减少d,把所有以v为起点的边权值增加d,最后要让所有的边权值为正,且尽量大.若无解,输出结果.若可无限大,输出结 ...
- Github托管代码步骤
总结一下Github上项目托管步骤: Step 1:注册Github帐号,并创建一个repository,假如仓库名为test: Step 2:安装本地Git: sudo apt-get instal ...
- openssl安装
www.openssl.orgconfigure the environment:<pre lang="bash" escaped="true">t ...
- liux环境下配置jdk
大家都知道,现在JAVA的发展可谓是如日中天,它覆盖面非常广泛,小到个人PC,大到商业应用都能见到它的身影.以前它是由SUN公司来维护的,现在已经归属到甲骨文旗下了. 今天我们来学习一下Java JD ...
- ajax读取json数据
首先建立json.txt文件 { "programmers": [ { "firstName": "Brett", "lastNa ...
- Bootstrap学习笔记上(带源码)
阅读目录 排版 表单 网格系统 菜单.按钮 做好笔记方便日后查阅o(╯□╰)o bootstrap简介: ☑ 简单灵活可用于架构流行的用户界面和交互接口的html.css.javascript工具集 ...