[CSP-S模拟测试]:赛(贪心+三分)
题目描述
由于出题人思维枯竭所以想不出好玩的背景。
有$n$个物品,第$i$个物品的价格是$v_i$,有两个人,每个人都喜欢$n$个物品中的一些物品。
要求选出正好$m$个物品,满足选出的物品中至少有$k$个物品被第一个人喜欢,$k$个物品被第二个人喜欢。并求出最小的价格和。
输入格式
第一行三个数$n,m,k$。
第二行$n$个数,第$i$个数表示$v_i$。
第三行包含一个数$a$,表示第一个人喜欢的物品数。
第四行包含$a$个数,表示第一个人喜欢的物品是哪几个。
第五行包含一个数$b$,表示第二个人喜欢的物品数。
第六行包含$b$个数,表示第二个人喜欢的物品是哪几个。
输出格式
一个数表示答案。若不存在合法的方案则输出$-1$。
样例
样例输入:
4 3 2
3 2 2 1
2
1 2
2
1 3
样例输出:
7
数据范围与提示
对于测试点$1\sim 4$:$n\leqslant 20$。
对于测试点$5\sim 10$:不存在一个物品被两个人喜欢。
对于测试点$11\sim 15$:$n\leqslant 2\times 10^3$。
对于测试点$16\sim 20$:无特殊限制。
对于所有的数据,$n\leqslant 2\times 10^5,m,k\leqslant n,v_i\leqslant 10^9$。
题解
这道题优秀的随机化可以拿到$95$分……

我们可以设两个人喜欢的物品交集个数为$r$,那么我们就可以贪心了。
发现答案满足单谷,于是我们可以三分。
其实三分也是存在漏洞的,因为一段的$r$可能对应一样的答案,但是显然随机数据没有卡。
时间复杂度:$\Theta(n\log k)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int N,M,K,A,B;
int v[200001];
bool a[200001],b[200001];
int que[4][200001],top1,top2,top3,top4;
long long ans=1LL<<60;
bool cmp(int x,int y){return v[x]<v[y];}
long long judge(int x)
{
long long res=0;
for(int i=1;i<=x;i++)res+=v[que[3][i]];
for(int i=1;i<=K-x;i++){res+=v[que[1][i]];res+=v[que[2][i]];}
int lst=M-x-2*max(K-x,0);
int flag1=max(K-x,0)+1;
int flag2=max(K-x,0)+1;
int flag3=1;
while(lst)
{
if(v[que[1][flag1]]<=v[que[2][flag2]]&&v[que[1][flag1]]<=v[que[0][flag3]])
{
res+=v[que[1][flag1]];
flag1++;
}
else if(v[que[2][flag2]]<=v[que[1][flag1]]&&v[que[2][flag2]]<=v[que[0][flag3]])
{
res+=v[que[2][flag2]];
flag2++;
}
else
{
res+=v[que[0][flag3]];
flag3++;
}
lst--;
}
return res;
}
int main()
{
scanf("%d%d%d",&N,&M,&K);
for(int i=1;i<=N;i++)scanf("%d",&v[i]);
scanf("%d",&A);
for(int i=1;i<=A;i++)
{
int x;
scanf("%d",&x);
a[x]=1;
}
scanf("%d",&B);
for(int i=1;i<=B;i++)
{
int x;
scanf("%d",&x);
b[x]=1;
}
for(int i=1;i<=N;i++)
{
if(!a[i]&&!b[i])que[0][++top1]=i;
if( a[i]&&!b[i])que[1][++top2]=i;
if(!a[i]&& b[i])que[2][++top3]=i;
if( a[i]&& b[i])que[3][++top4]=i;
}
if(top2+top4<K||top3+top4<K||top4<max(2*K-M,0)||M<K||min(top4,K)+2*max(K-top4,0)>M){puts("-1");return 0;}
sort(que[0]+1,que[0]+top1+1,cmp);
sort(que[1]+1,que[1]+top2+1,cmp);
sort(que[2]+1,que[2]+top3+1,cmp);
sort(que[3]+1,que[3]+top4+1,cmp);
v[0]=0x3f3f3f3f;
int lft=max(K-min(top2,top3),max(2*K-M,0));
int rht=min(K,top4);
while(rht-lft>2)
{
int midl=lft+(rht-lft)/3;
int midr=rht-(rht-lft)/3;
if(judge(midl)<judge(midr))rht=midr;
else lft=midl;
}
ans=min(ans,judge(lft));
ans=min(ans,judge(lft+1));
ans=min(ans,judge(rht));
if(ans==(1LL<<60))puts("-1");
else printf("%lld",ans);
return 0;
}
rp++
[CSP-S模拟测试]:赛(贪心+三分)的更多相关文章
- [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania
[2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...
- noi2019模拟测试赛(四十七)
noi2019模拟测试赛(四十七) T1与运算(and) 题意: 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...
- [CSP-S模拟测试]:C(三分+贪心)
题目传送门(内部题46) 输入格式 第一行$3$个整数$n,m,t$.第二行$n$个整数,表示$P_i$.接下来$m$行每行两个整数,表示$L_i,R_i$. 输出格式 一行一个整数表示答案. 样例 ...
- 2018.8.6 Noip2018模拟测试赛(十九)
日期: 八月六号 总分: 300分 难度: 提高 ~ 省选 得分: 10分(MMP) 题目目录: T1:Tree T2:异或运算 T3:Tree Restoring 赛后反思: Emmmmm ...
- 2018.7.31 Noip2018模拟测试赛(十六)
日期: 七月最后一天 总分: 300分 难度: 提高 ~ 省选 得分: 30分(少的可怜) 我太弱了:(题目目录) T1:Mushroom追妹纸 T2:抵制克苏恩 T3:美味 失分分析:(QA ...
- 2018.8.8 Noip2018模拟测试赛(二十一)
日期: 八月七号 总分: 300分 难度: 提高 ~ 省选 得分: 112分(OvO) 题目目录: T1:幸福的道路 T2:Solitaire T3:Flags 赛后心得: 第一题裸树d啊! ...
- 2018.8.7 Noip2018模拟测试赛(二十)
日期: 八月七号 总分: 300分 难度: 提高 ~ 省选 得分: 100分(呵呵一笑) 题目列表: T1:SS T2:Tree Game T3:二元运算 赛后反思: Emmmmmm…… 开 ...
- 2017.8.2 Noip2018模拟测试赛(十八)
日期: 八月二日 总分: 300分 难度: 提高 ~ 省选 得分: 40分(又炸蛋了!!) 题目列表: T1:分手是祝愿 T2:残缺的字符串 T3:树点涂色 赛后心得: 哎,T1求期望,放弃. ...
- 2017.8.1 Noip2018模拟测试赛(十七)
日期: 八月第一天 总分: 300分 难度: 提高 ~ 省选 得分: 100分(不应该啊!) 题目目录: T1:战争调度 T2:选数 T3:由乃的OJ 赛后心得: MMP,首先第一题花了大概 ...
随机推荐
- charles_01_打断点修改接口请求&返回数据
前言 测试过程中,为了模拟某场景测试,经常需要修改接口请求或者返回数据.可通过抓包工具打断点,实现模拟测试场景.常用的抓包工具charles和fiddler均可打断点mock数据.由于小编安装了cha ...
- discover面试
电话面 英语 20191009 面试我的是一个小姐姐,她是数据挖掘分析师,声音很甜很好听.全程英文 (1)please introduce yourself in two minutes (2)我对你 ...
- 编写 Chrome 扩展——contextMenus 的快捷创建
1 写在前面 最近使用 typescript 与 angular 编写 chrome 扩展, 对繁复的 contextMenus 创建步骤进行了提炼,并总结一个类 2 重构思路 2.1 一般方法 在编 ...
- 记录将CentOS7linux系统python升级到3后yum安装是报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ SyntaxError: invalid syntax问题解决
前两天将CentOS7里的python版本升级到了3.5.2 今天想装个解压软件,在执行yum install -y XXX 的时候报错 然后按照提示打开这个文件 vi /usr/bin/yum yu ...
- [Vim 填坑] 01 Vim 中替换与注释的补充
目录 1. print( 坑的信息 ) 2. 开始填坑 (1) :n1,n2s/old/new/gc 的后续命令 ^E ^Y (2) 利用"V-可视"模式进行多行注释 1. pri ...
- 关于mysql的使用命令(持续更新中...)
特别提示 本说明中的mysql 是基于windwos平台下的5.5 版本 安装完成后 请到mysql中设置配置文件 链接分享:链接:https://pan.baidu.com/s/1tv4ulZ ...
- 自动生成脚本头部格式并调用VIM工具
在我们写脚本的时候,开始总要按照脚本书写规范来定义脚本头部格式,久而久之是不是会觉得麻烦效率低下呢,这里就介绍一个好的思路给大家. 1 首先我们在VIM里先复制个头部格式的内容,这里就抄袭一个二师兄的 ...
- make: *** 没有指明目标并且找不到 makefile
make: *** 没有指明目标并且找不到 makefile. 停止. make: *** 没有规则可以创建目标“install”. 停止. 不是没有makefile文件,而是你没有安装gcc编译 ...
- 微信JS-SDK选择图片遇到的坑
微信JS-SDK选择图片遇到的坑 有个需求要在微信企业号里面做开发,有个功能是选择图片,使用input标签肯定是不管用了,Android手机上不能多选,所以使用了微信的JS-SDK提供的相关API,这 ...
- Rsync+sersync 数据同步指南
(1):sersync 可以记录下被监听目录中发生变化的(包括增加.删除.修改)具体某一个文件或 某一个目录的名字: (2):rsync 在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变 ...