BZOJ 4985: 评分 二分答案 dp判定
来源:互联网 发布:计算机算法设计 网课 编辑:程序博客网 时间:2024/06/05 16:13
4985: 评分
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 46 Solved: 34
[Submit][Status][Discuss]
Description
Lj最近参加一个选秀比赛,有N个评委参加了这次评分,N是奇数。评委编号为1到N。每位评委给Lj打的分数是一个整数,评委i(1 ≦ i ≦ N)的打分为Di。这次采用了一种创新的方法计算最后得分,计算规则是:最初N位评委排成一排,检查队伍排头的3位评委的评分,去掉一个最高分和一个最低分,剩下的一个评委移动到队伍最后,反复执行以上操作,直到队伍中的评委只剩一位,那么这个评委的打分就是Lj的最后得分。由于有的评委年纪比较大了,不记得自己的位置了,现在有M(1 ≦ M ≦ N - 2)个评委很快找到了自己的位置,剩下的N-M人找不到位置了,需要给他们重新安排位置。由于Lj希望自己的得分尽可能高。请你帮忙计算出LJ最后得分可能的最大值。
Input
第一行为整数N和M,用空格分隔。表示有N位评委,其中M人的初始排列位置已经确定。
接下来M行中第i行(1 ≦ i ≦ M)为两个整数Di和Pi,用空格分隔。
表示第i位评委的评分为Di,初始排列位置为队伍排头开始的第Pi位。
接下来N-M行中第i行(1 ≦ i ≦ N ? M)为整数Di+M,表示评委(i+M)的评分为Di+M。
3 ≦ N ≦ 99 999,
1 ≦ M ≦ N - 2,
1 ≦ Di ≦ 109 (1 ≦ i ≦ N),
1 ≦ Pi ≦ N (1 ≦ i ≦ M),
Pi != Pj (1 ≦ i < j ≦ M)。
Output
输出一行,为1个整数,表示LJ得分的最大值。
Sample Input
7 3
5 2
5 5
8 6
6
2
8
9
5 2
5 5
8 6
6
2
8
9
Sample Output
8
//最高得分的评分排列:2, 5, 6, 8, 5, 8, 9
//最高得分的评分排列:2, 5, 6, 8, 5, 8, 9
感觉这个题不是很好想到
翻了题解。。。
二分答案 然后用dp判定
怎么判定呢
设f(i)表示把令i位置的值>=二分答案x时,最少需要几个额外的(固定的)>=x的数在这之前为他挡枪
之后直接模拟删除过程,并dp转移就好了
D_n-m~D_n是可以随便放的所以他们是可以有的额外的数
然后求解出最后位置所需要的数,比较是否够用就可以了
最开始1~n每个位置i
若不确定
则f(i)=1 因为需要放一个>=x的数
若确定
若d[i]>=x f(i)=0 因为已经>=x不用多余的数来挡枪
否则f(i)=inf 无论如何也不能比>=x
之后每个位置由目前最前面的三个转移过来
不妨设他们的dp值为x,y,z
则转移方程为f(i)=min(x+y,x+z,y+z,inf)
#include<cmath>#include<ctime>#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<set>#include<map>using namespace std;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}void print(int x){if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=100100,inf=0X3f3f3f3f;int n,m,a[N],b[N];int q[N<<1];inline bool check(int val){register int i,tmp=0,head=0,tail=0,x,y,z;for(i=1;i<=n-m;++i)tmp+=(b[i]>=val);for(i=1;i<=n;++i){if(!a[i])q[tail++]=1;else if(a[i]>=val)q[tail++]=0;else q[tail++]=inf;}while(tail>head+1){x=q[head++];y=q[head++];z=q[head++];q[tail++]=min(min(x+y,x+z),min(y+z,inf));}return q[head]<=tmp;}int main(){n=read();m=read();register int i,l=1,r=int(1e9),mid,x,y;for(i=1;i<=m;++i){x=read();y=read();a[y]=x;}for(i=1;i<=n-m;++i)b[i]=read();while(l<=r){mid=(l+r)>>1;check(mid)?l=mid+1:r=mid-1;}print(l-1);puts("");return 0;}/*7 35 25 58 662898*/
阅读全文
0 0
- BZOJ 4985: 评分 二分答案 dp判定
- bzoj4985 评分(二分答案+dp)
- bzoj 2653 middle 二分答案 主席树判定
- [BZOJ]2095 二分答案 + 混合图欧拉回路判定
- BZOJ 2097 Exercise 奶牛健美操 二分答案+树形DP+贪心
- BZOJ 2067 POI 2004 SZN 树形DP 贪心 二分答案
- [贪心 模拟 + 二分答案 DP] BZOJ 1181 [CROATIAN2009]IZBROI选举
- bzoj 4753: [Jsoi2016]最佳团体 二分答案+树形dp
- BZOJ 1044: [HAOI2008]木棍分割(二分答案+DP)
- bzoj 2016 二分答案
- BZOJ-5090 (二分答案)
- POJ3579 Median(二分答案 + O(N)判定)
- POJ3579 Median(二分答案 + O(N)判定)
- BZOJ 3761 甄嬛 二分答案
- BZOJ 2097 USACO 2010 Dec Gold Exercise 奶牛健美操 二分答案 树形DP 贪心
- bzoj 1863: [Zjoi2006]trouble 皇帝的烦恼(二分答案+dp)
- 【bzoj 1863】[Zjoi2006]trouble 皇帝的烦恼(二分答案+dp)
- BZOJ 1044: [HAOI2008]木棍分割 DP,前缀和优化,二分答案
- react-native的WebView使用
- 广州富敦举办下午茶不仅是员工福利,更是情怀
- 最近项目中给图片添加水印老失败,报错信息如下
- DDR3 寻址及原理
- 第九周java作业
- BZOJ 4985: 评分 二分答案 dp判定
- 深入理解Java线程池
- 在windows上面搭建git远程仓库
- Java NIO系列教程(1): Java NIO 概述
- IOS学习 一 Objective-C
- 简单的插入排序
- vex使用...mapActions报错解决办法
- 颜色表示以及在processing中的应用
- 笨方法学习Python-习题33: While 循环