CF798D Mike and distribution
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的更多相关文章
- CF798D Mike and distribution 贪心
我感觉这道题挺神的~ 假设 $a[i]=b[i]$,那么我们可以将 $a$ 降序排序,然后你发现只要你按照 $1,3,5......n$ 这么取一定是合法的. 而我们发现 $2$ 比取 $3$ 优,取 ...
- codeforces 798 D. Mike and distribution
D. Mike and distribution time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- #410div2D. Mike and distribution
D. Mike and distribution time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- D. Mike and distribution 首先学习了一个玄学的东西
http://codeforces.com/contest/798/problem/D D. Mike and distribution time limit per test 2 seconds m ...
- Codeforces 798D Mike and distribution(贪心或随机化)
题目链接 Mike and distribution 题目意思很简单,给出$a_{i}$和$b_{i}$,我们需要在这$n$个数中挑选最多$n/2+1$个,使得挑选出来的 $p_{1}$,$p_{2} ...
- CF410div2 D. Mike and distribution
/* CF410div2 D. Mike and distribution http://codeforces.com/contest/798/problem/D 构造 题意:给出两个数列a,b,求选 ...
- [CF798D]Mike and distribution_贪心
Mike and distribution 题目链接:http://codeforces.com/problemset/problem/798/D 数据范围:略. 题解: 太难了吧这个题..... 这 ...
- Codeforces 798D Mike and distribution - 贪心
Mike has always been thinking about the harshness of social inequality. He's so obsessed with it tha ...
- 【算法系列学习】codeforces D. Mike and distribution 二维贪心
http://codeforces.com/contest/798/problem/D http://blog.csdn.net/yasola/article/details/70477816 对于二 ...
随机推荐
- acwing 873. 欧拉函数 模板
地址 https://www.acwing.com/problem/content/875/ 给定n个正整数ai,请你求出每个数的欧拉函数. 欧拉函数的定义 输入格式 第一行包含整数n. 接下来n行, ...
- P4728 [HNOI2009]双递增序列
题意 这个DP状态有点神. 首先考虑一个最暴力的状态:\(f_{i,j,k,u}\)表示第一个选了\(i\)个,第二个选了\(j\)个,第一个结尾为\(k\),第二个结尾为\(u\)是否可行. 现在考 ...
- Java连载47-多态基础语法、作用
一.多态的语法 1.两个类之间没有继承关系的,使用多态是不能编译的. 2.无论向上还是向上转型,都需要有继承关系. 3.什么时候需要向下转型? 当调用的方法或者属性是子类型特有的,在父类型中不存在,就 ...
- 搭建Tomcat服务器访问本地资源
目标,搭建Tomcat服务器,使同网络段下其他电脑可以访问分享的文件 下载安装Tomcat 如下图,在官网http://Tomcat.apache.org/下载对应版本的Tomcat,解压安装即可 启 ...
- selenium元素定位方法之轴定位
一.轴运算名称 ancestor:祖先结点(包括父结点) parent:父结点 preceding:当前元素节点标签之前的所有结点(html页面先后顺序) preceding-sibling:当前元素 ...
- Linux网络基础协议和ip管理
1.简述osi七层模型和TCP/IP五层模型 osi七层模型分别是:物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. 1)物理层:这一层的主要功能是二进制传输数据,界定连接器和网线的规格: ...
- Delphi 10.2 Tokyo新增JSON类学习——TJsonSerializer
Delphi 10.3.2 for windows 7 编译通过,源码下载地址: Tokyo 10.2新增类,效率更高更快 TJsonSerializer 需要引用单元:System.JSON.Ser ...
- gitlab与jenkins结合构建持续集成
Jenkins是java编写,需要安装JDK,这里采用 yum 安装,对版本有需求的,可以到 oracle 官网下载 JDK. yum install -y java-1.8.0-openjdk 一. ...
- DatabaseLibrary -数据库操作
操作数据库: Table Must Exist 验证表必须存在,存在则Pass,反之Fail Delete All Rows From Table 删除数据库中表的所有行 Execute Sql St ...
- Spring MVC接口实例
概述 前文记录了MVC模式和Spring MVC的初步认识,现在记录创建一个项目,配置Spring MVC,编写接口程序. 创建项目 打开IntelliJ IDEA,点击"File-> ...