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的更多相关文章

  1. 【POJ 3140】 Contestants Division(树型dp)

    id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS   Memory Limit: 65536K Tot ...

  2. bzoj 2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...

  3. 【链表】BZOJ 2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 382  Solved: 111[Submit][S ...

  4. BZOJ2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 284  Solved: 82[Submit][St ...

  5. BZOJ2293: 【POJ Challenge】吉他英雄

    2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 80  Solved: 59[Submit][Stat ...

  6. BZOJ2287: 【POJ Challenge】消失之物

    2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 254  Solved: 140[Submit][S ...

  7. BZOJ2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 126  Solved: 90[Submit][Sta ...

  8. BZOJ2296: 【POJ Challenge】随机种子

    2296: [POJ Challenge]随机种子 Time Limit: 1 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 114  Solv ...

  9. BZOJ2292: 【POJ Challenge 】永远挑战

    2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 513  Solved: 201[Submit][ ...

随机推荐

  1. 【Linux】ethtool 用法

    ethtool命令用于获取以太网卡的配置信息,或者修改这些配置.这个命令比较复杂,功能特别多. 语法 ethtool [ -a | -c | -g | -i | -d | -k | -r | -S | ...

  2. i春秋新春战疫—web—简单的招聘系统

    打开靶机 打开后看到登录界面 利用万能密码,以admin身份登录 登录成功后看到如下界面 在Blank Page界面内发现注入点,抓包 保存在sqlmap目录下test.txt文件夹,使用sqlmap ...

  3. 为什么会有 AtomicReference ?

    我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 我们之前了解过了 AtomicInteger.Ato ...

  4. 主题模型值LDA

    主题模型(topic model)是以非监督学习的方式对文集的隐含语义结构(latent semantic structure)进行聚类(clustering)的统计模型. 主题模型主要被用于自然语言 ...

  5. PAT Advanced 1003 Emergency 详解

    题目与翻译 1003 Emergency 紧急情况 (25分) As an emergency rescue team leader of a city, you are given a specia ...

  6. mybatis-plubs条件构造器中的方法所对应的sql语法

    [通用条件:] [比较大小: ( =, <>, >, >=, <, <= )] eq(R column, Object val); // 等价于 =,例: eq(& ...

  7. mastercam2018安装教程

    安装前先关闭杀毒软件和360卫士,注意安装路径不能有中文,安装包路径也不要有中文. [安装环境]:Win7/Win8/Win10 1.选中[Mastercam2018]压缩包,鼠标右击选择[解压到Ma ...

  8. 华为交换机telnet登录时老是提醒是否更改初始密码- Warning: The initial password poses security risks

    问题:华为交换机在Telnet登录的时候总是提示初始密码不安全需要修改密码的处理方法 Warning: The initial password poses security risks   如果你输 ...

  9. Python_1生成器(下)之单线并行--生产着消费者模型

    1 import time 2 def consumer(name): 3 print('%s准备吃包子了!' %name) 4 while True: 5 baozi = yield 6 print ...

  10. Redis 底层数据结构设计

    10万+QPS 真的只是因为单线程和基于内存?_Howinfun的博客-CSDN博客_qps面试题 https://blog.csdn.net/Howinfun/article/details/105 ...