【POJ 1148】Utopia Divided
Utopia Divided
题目链接:POJ 1148
题目大意
在一个坐标系中,一个点一开始在原点,然后被要求每次走到一个规定的象限内。
你有一些互不相同的数,每次你可以选每选过的两个,正负性可以自己改,使得点的坐标加上这两个数。
所有数会刚好用完。
要你输出任意一种合法方案,如果没有方案就输出 0。
思路
这道题我们可以用贪心的思想来做。
我们考虑让 \(x,y\) 轴分开。
我们先以 \(x\) 轴为例子,\(y\) 轴同理。
按假设现在是正的,你要改成负的(或者负的改成正的),那你就要加或减一个比当前坐标绝对值大的数。
那选数就是选比上一次选还要大的数。
那如果跟原来一样,那你可能有两个选择。要么继续离远点更远,要么靠近远点,但是不会大于当前距离。
那你为了到时还可以改正负,你肯定是让离原点近一点好。
那我们就一定是选比上一次选还要小的数。
那我们还可以看出 \(x,y\) 轴之间没有影响,那我们可以随便吧数分成两部分,数量都是 \(n\)。然后分别处理。
那我们还是只看 \(x\) 轴的那 \(n\) 个数。
那我们就通过看象限的变化,以及当时的位置,就可以贪心出选大的还是小的,正的还是负的了。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int n, a[20001], u[20001], x[20001], y[20001];
int l1, r1, zff[20001], l2, r2;
int xsum, ysum;
bool cmp(int x, int y) {
return x < y;
}
void zf(int x) {
if (x == 1) printf("+");
else printf("-");
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= 2 * n; i++) scanf("%d", &a[i]);
sort(a + 1, a + 2 * n + 1, cmp);
for (int i = 1; i <= n; i++) {
scanf("%d", &u[i]);
if (u[i] & 1) {//记录xy坐标正负性
if (u[i] / 2) x[i] = y[i] = -1;
else x[i] = y[i] = 1;
}
else if (u[i] / 2 == 1) {
x[i] = -1;
y[i] = 1;
}
else {
x[i] = 1;
y[i] = -1;
}
if (i > 1) {//统计要多少个小的
if (x[i] == x[i - 1]) l1++;
if (y[i] == y[i - 1]) l2++;
}
}
r1 = l1 + 1;
r2 = l2 + 1;
zff[n] = x[n];//得出数的正负
zff[n + n] = y[n];
for (int i = n - 1; i >= 1; i--) {
zff[i] = zff[i + 1] * -1;
zff[n + i] = zff[n + i + 1] * -1;
}
zf(zff[r1]);//先处理第一个数
printf("%d ", a[r1]);
r1++;
zf(zff[n + r2]);
printf("%d\n", a[n + r2]);
r2++;
for (int i = 2; i <= n; i++) {
if (zff[r1 - 1] * x[i] < 0) {//选大的
zf(zff[r1]);
printf("%d ", a[r1]);
r1++;
}
else {//选小的
zf(zff[l1]);
printf("%d ", a[l1]);
l1--;
}
if (zff[n + r2 - 1] * y[i] < 0) {//同理
zf(zff[n + r2]);
printf("%d\n", a[n + r2]);
r2++;
}
else {
zf(zff[n + l2]);
printf("%d\n", a[n + l2]);
l2--;
}
}
return 0;
}
【POJ 1148】Utopia Divided的更多相关文章
- 【POJ 3140】 Contestants Division(树型dp)
id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS Memory Limit: 65536K Tot ...
- bzoj 2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
- BZOJ2293: 【POJ Challenge】吉他英雄
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
- BZOJ2287: 【POJ Challenge】消失之物
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 254 Solved: 140[Submit][S ...
- BZOJ2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 126 Solved: 90[Submit][Sta ...
- BZOJ2296: 【POJ Challenge】随机种子
2296: [POJ Challenge]随机种子 Time Limit: 1 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 114 Solv ...
- BZOJ2292: 【POJ Challenge 】永远挑战
2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 513 Solved: 201[Submit][ ...
随机推荐
- iostat的输出
第一行显示的时子系统启动以来的平均值,接下来的报告显示了增量的平均值,每个设备一行 Device: rrqm/s wrqm/s r/s w/s rsec/s ...
- 使用axis1.4生成webservice的客户端代码
webservice服务端: https://blog.csdn.net/ghsau/article/details/12714965 跟据WSDL文件地址生成客服端代码: 1.下载 axis1.4 ...
- RecyclerView 源码分析(二) —— 缓存机制
在前一篇文章 RecyclerView 源码分析(一) -- 绘制流程解析 介绍了 RecyclerView 的绘制流程,RecyclerView 通过将绘制流程从 View 中抽取出来,放到 Lay ...
- 安装git-macOS系统
通过homebrew安装Git 1.安装homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/H ...
- Python-Flask搭建Web项目
最近因项目需要,学习了用flask搭建web项目,以下是自己的使用感悟 Flask框架结构 static:存储一些静态资源 templates:存储对应的view app.py:涉及到页面的跳转,以及 ...
- HA工作机制
HA工作机制 HA:高可用(7*24小时不中断服务) 主要的HA是针对集群的master节点的,即namenode和resourcemanager,毕竟DataNode挂掉之后影响 不是特别大,重启就 ...
- Golang 性能优化实战
小结: 1. 性能查看工具 pprof,trace 及压测工具 wrk 或其他压测工具的使用要比较了解. 代码逻辑层面的走读非常重要,要尽量避免无效逻辑. 对于 golang 自身库存在缺陷的,可以寻 ...
- CF1433F Zero Remainder Sum
写在前面 思维难度不是很大的 DP,代码实现也很容易. 状态设计模式很套路,转移也很好理解. 算法思路 (因为 \(k\) 是常用的循环变量,下文中将题面中的模数改为 \(p\)) 虽然要求的是模 \ ...
- socket套接字编程(1)——基本函数
TCP交互流程: 服务器:1. 创建socket:2. 绑定socket和端口号:3. 监听端口号:4. 接收来自客户端的连接请求:5. 从socket中读取字符:6. 关闭socket. 客户端:1 ...
- Django(静态文件or路由)
静态文件 在开发中同创会使用到 css,js,img等静态文件,这里带大家简单的介绍一下django如何处理静态页面, 配置 setting.py文件 STATIC_URL = '/static/' ...