CF798D Mike and distribution

洛谷评测传送门

题目描述

Mike has always been thinking about the harshness of social inequality. He's so obsessed with it that sometimes it even affects him while solving problems. At the moment, Mike has two sequences of positive integers A=[a_{1},a_{2},...,a_{n}]A=[a1,a2,...,a**n] and B=[b_{1},b_{2},...,b_{n}]B=[b1,b2,...,b**n] of length nn each which he uses to ask people some quite peculiar questions.

To test you on how good are you at spotting inequality in life, he wants you to find an "unfair" subset of the original sequence. To be more precise, he wants you to select kk numbers P=[p_{1},p_{2},...,p_{k}]P=[p1,p2,...,p**k] such that 1<=p_{i}<=n1<=p**i<=n for 1<=i<=k1<=i<=k and elements in PP are distinct. Sequence PP will represent indices of elements that you'll select from both sequences. He calls such a subset PP "unfair" if and only if the following conditions are satisfied: 2·(a_{p1}+...+a_{pk})2⋅(a**p1+...+apk) is greater than the sum of all elements from sequence AA , and 2·(b_{p1}+...+b_{pk})2⋅(b**p1+...+bpk) is greater than the sum of all elements from the sequence BB . Also, kk should be smaller or equal to because it will be to easy to find sequence PP if he allowed you to select too many elements!

Mike guarantees you that a solution will always exist given the conditions described above, so please help him satisfy his curiosity!

输入格式

The first line contains integer nn ( 1<=n<=10^{5}1<=n<=105 ) — the number of elements in the sequences.

On the second line there are nn space-separated integers a_{1},...,a_{n}a1,...,a**n ( 1<=a_{i}<=10^{9}1<=a**i<=109 ) — elements of sequence AA .

On the third line there are also nn space-separated integers b_{1},...,b_{n}b1,...,b**n ( 1<=b_{i}<=10^{9}1<=b**i<=109 ) — elements of sequence BB .

输出格式

On the first line output an integer kk which represents the size of the found subset. kk should be less or equal to .

On the next line print kk integers p_{1},p_{2},...,p_{k}p1,p2,...,p**k ( 1<=p_{i}<=n1<=p**i<=n ) — the elements of sequence PP . You can print the numbers in any order you want. Elements in sequence PP should be distinct.

题意翻译

题意:给两个长度为n的数列A,B,要求至多选择n/2+1个下标,使得A数组中选出的数的和的两倍大于sumA,B数组中选出的数的和的两倍大于sumB

输入输出样例

输入 #1复制

输出 #1复制

题解:

2019.10.22模拟赛40分场

一看就是道贪心的题。这自然不必说。重点在于如何建立贪心策略和维护贪心的正确性(也是把本蒟蒻卡的死死的点)。

先来理解一下题意:要选出\(n/2+1\)对数,使得这些数的二倍比原数列和还大。

于是我们得到了一个结论:这些数是按对选的,也就是绑定选择。

根据这个思路,我们想到了构建结构体解决问题。

因为我们输出的时候要输出数组下标,所以我们不仅维护每个位置的数(a和b),而且还要构建一个映射关系,即要把数对的位置也存进结构体。这些都是基础操作,我就不多说了。

考场上直接写了爆搜加部分分骗了40

后来看了正解,加上一些自己的理解和证明,得出了这篇辣鸡博客。

我曾经\(YY\)过,贪心总是和排序结合在一起的,这道题当然不会例外。但是我们这道题的排序有一些困难,难点还是在于绑定选择。我们能通过对\(A\)数列或\(B\)数列排序来维护有解的情况,但是我们并无法构建一种可行的排序,使得在维护\(A\)序列的同时还维护\(B\)序列的正确性。

于是我们“退而求其次”,我们只维护\(A\)序列,然后乱搞搞尽量维护\(B\)序列的正确性,能行就行,不行拉倒。

然后我们建一个结构体\(num[i].a.b.id\),分别存\(A,B\)序列的值以及序号。之后按照\(A\)序列进行排序,根据贪心原则,我们选靠前的项一定对答案贡献更大。那我们就直接考虑\(B\)序列。

这里的贪心策略与正常的贪心略有不同。对于这种题目,我们经常会被拐进:对于每个物品,选还是不选的误区。于是我们便走进了一个死胡同,发现好像怎么证明都无法得出正确的答案。所以,我们提出一种全新的贪心选择的思路(应该也比较常见):对于一对物品,选第一个还是第二个。

于是,我们先选\(num[1]\)(因为个数是\(n/2+1\)),然后对于之后的每对物品,选择其中\(num[i].b\)值更大的那个。这就是正确的贪心决策了。

怎么证明呢?

因为我们是按\(A\)关键词排序,所以得出的序列肯定是\(A\)大的在前面,因为我们是捆绑选择。所以我们在\(A\)序列有序的基础上按对选择\(B\),得出的答案一定是最优的。

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+1;
int n,tot,ans[maxn];
struct node
{
int a,b,id;
}num[maxn];
bool cmp(node a,node b)
{
return a.a>b.a;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i].a);
num[i].id=i;
}
for(int i=1;i<=n;i++)
scanf("%d",&num[i].b);
sort(num+1,num+n+1,cmp);
int cnt=n/2+1;
ans[++tot]=num[1].id;
for(int i=2;i<=n;i+=2)
{
if(num[i].b>num[i+1].b)
ans[++tot]=num[i].id;
else
ans[++tot]=num[i+1].id;
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
printf("%d ",ans[i]);
return 0;
}

CF798D Mike and distribution的更多相关文章

  1. CF798D Mike and distribution 贪心

    我感觉这道题挺神的~ 假设 $a[i]=b[i]$,那么我们可以将 $a$ 降序排序,然后你发现只要你按照 $1,3,5......n$ 这么取一定是合法的. 而我们发现 $2$ 比取 $3$ 优,取 ...

  2. codeforces 798 D. Mike and distribution

    D. Mike and distribution time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  3. #410div2D. Mike and distribution

    D. Mike and distribution time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. D. Mike and distribution 首先学习了一个玄学的东西

    http://codeforces.com/contest/798/problem/D D. Mike and distribution time limit per test 2 seconds m ...

  5. Codeforces 798D Mike and distribution(贪心或随机化)

    题目链接 Mike and distribution 题目意思很简单,给出$a_{i}$和$b_{i}$,我们需要在这$n$个数中挑选最多$n/2+1$个,使得挑选出来的 $p_{1}$,$p_{2} ...

  6. CF410div2 D. Mike and distribution

    /* CF410div2 D. Mike and distribution http://codeforces.com/contest/798/problem/D 构造 题意:给出两个数列a,b,求选 ...

  7. [CF798D]Mike and distribution_贪心

    Mike and distribution 题目链接:http://codeforces.com/problemset/problem/798/D 数据范围:略. 题解: 太难了吧这个题..... 这 ...

  8. Codeforces 798D Mike and distribution - 贪心

    Mike has always been thinking about the harshness of social inequality. He's so obsessed with it tha ...

  9. 【算法系列学习】codeforces D. Mike and distribution 二维贪心

    http://codeforces.com/contest/798/problem/D http://blog.csdn.net/yasola/article/details/70477816 对于二 ...

随机推荐

  1. python操作队列

    进行队列的操作,首先要引入queue这个库 一:设置队列(括号中是队列可容纳数据的多少,如果不设置,则可以一直增加) import queue q = queue.Queue(10) 二:添加/获取元 ...

  2. IDEA的@Override下面有红色波浪线怎么去掉

    测试了 , 不会影响运行 ! 去掉红线 ! file - seting - java compiler - 把两个version都改成1.8  !  (  因为我的jdk是1.8) file - pr ...

  3. shell 下

    一句话来概括shell    shell是一个基于Linux内核和应用程序之间的一个解释器 Shell解释器    /bin/sh    /bin/bash  目前多用的是bash    /sbin/ ...

  4. 深入理解typescript的Functions

    Functions Introduction # Functions are the fundamental building block of any application in JavaScri ...

  5. IT兄弟连 Java语法教程 流程控制语句 分支结构语句1

    不论哪一种编程语言,都会提供两种基本的流程控制结构:分支结构和循环结构.其中分支结构用于实现根据条件来选择性地执行某段代码,循环结构则用于实现根据循环条件重复执行某段代码.Java同样提供了这两种流程 ...

  6. C# 如何添加自定义键盘处理事件 如何配置app.config ? | csharp key press event tutorial and app.config

    本文首发于个人博客https://kezunlin.me/post/9f24ebb5/,欢迎阅读最新内容! csharp key press event tutorial and app.config ...

  7. js判断undefined和null

    js判断undefined var exp = undefined; if (typeof(exp) == "undefined") { alert("undefined ...

  8. Java开发桌面程序学习(13)——Javafx多线程 下载功能

    普通使用 Task<Void> task = new Task<Void>() { @Override protected void succeeded() { super.s ...

  9. Java学习笔记 jar包获取当前路径

    情况 使用一个jar包,需要下载一个文件到与当前jar包同目录,如何去获取此目录? 代码 使用.即可作为当前的目录 windows环境下,我的jar包所在的目录为D:\test val dir = F ...

  10. 关于ScriptManager.RegisterStartupScript 摘录

    //ScriptManager.RegisterStartupScript 方法 (Control, Type, String, String, Boolean) public static void ...