题目链接


题意:

一共n个人,第 i 个人的财富度为 i,每个人有两个属性 ai 和 bi,分别表示最多能够容忍的比自己富和比自己穷的人数。
问,最多能够选多少人,使得所有人的要求都可以满足。

思路:

二分答案:二分选择的人数。
check
从前往后遍历所有人,判断拿了这个人是否能拿够mid个。即:
如果已经拿了的人数 cnt 不超过这个人的 bi,并且还没拿的 mid-cnt-1 个比其富有的人不超过 ai,那么这个人就是可以拿的。
最后判断拿的人数 cnt 是否大于等于 mid 个。

Code:

const int N = 200010, mod = 1e9+7;
int T, n, m;
PII a[N];bool check(int mid)
{int cnt=0;for(int i=1;i<=n;i++){if(a[i].fi>=mid-cnt-1&&a[i].se>=cnt) cnt++;if(cnt>=mid) return 1;}return 0;
}int main(){Ios;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i].fi>>a[i].se;int l=0,r=n;while(l<r){int mid=l+r+1>>1;if(check(mid)) l=mid;else r=mid-1;}cout<<l<<"\n";}return 0;
}

这道题的check除了最后,中间还用到了mid来作判断,类似于之前的 跳石头 那道题,但是又不太一样。
很奇很怪,很巧很妙!


又翻看了之前的二分答案的一道经典题:最佳牛围栏,发现又有了新的感悟。

题意是这样的:
一共 n 个数,要从中选出连续的至少为 m 个数。问,选出的这些数的平均值最大为多少?
看到这道题的时候想,为什么是二分呢?但是如果用二分来做,确实可以。。
如果较小的平均值能够满足的话,就往大了判断;不满足就往前来。

判断一个区间的平均值是否至少为mid:
将区间中的所有值都减掉mid,判断总和是否至少为0。如果是,那就说明这一段的总和至少为mid*n,也就是平均值至少为mid。

所以判断整个区间是否存在一段子区间的平均值满足至少为mid,就可以先将所有值都减去mid,找出最大子段和是否至少为0就可以了。
这个最大子段的原平均值便至少为mid。

用这种做法,就可以使得每次check都是O(n)的复杂度。

长度至少为m,只需要保证遍历的时候对当前位置的更新延迟m个位置便可。

const int N = 100010, mod = 1e9+7;
int T, n, m;
double a[N],b[N],s[N];bool check(double mid)
{for(int i=1;i<=n;i++) b[i]=a[i]-mid;double mina=2e9,sum=0;for(int i=1;i<=n;i++){s[i]=s[i-1]+b[i];if(i>=m){mina=min(mina,s[i-m]);if(s[i]-mina>=0) return 1;}}return 0;
}int main(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];double l=0,r=1e9;while(r-l>1e-5){double mid=(l+r)/2;if(check(mid)) l=mid;else r=mid;}cout<<(int)(r*1000);return 0;
}

之前暑假多校做过一个最佳牛围栏的改编题,加了点思维。

题目链接

题意:

有一个 n*m 的矩形 WWW,由下述方法构造:
Wi,j=ai+bj,∀i∈[1,n],∀j∈[1,m]W_{i,j}=a_{i}+b_{j},\forall i\in [1,n],\forall j\in [1,m]Wi,j​=ai​+bj​,∀i∈[1,n],∀j∈[1,m].

​现要找到长至少为x,宽至少为y的子矩阵,使其所有元素平均值最大。
输出最大值。

思路:

对于第一行,其总和为
W11+W12+W13+...+W1mW_{11}+W_{12}+W_{13}+...+W_{1m}W11​+W12​+W13​+...+W1m​
→ a1+b1+a1+b2+a1+b3+...+a1+bma_1+b_1+a_1+b_2+a_1+b_3+...+a_1+b_ma1​+b1​+a1​+b2​+a1​+b3​+...+a1​+bm​
→ m∗a1+b1+b2+...+bmm*a_1 + b_1+b_2+...+b_mm∗a1​+b1​+b2​+...+bm​
其平均值为 a1a_1a1​ 加 bi之和的平均值
为了使得第一行的平均值最大,那么就是要让 b1+b2+...+bmb_1+b_2+...+b_mb1​+b2​+...+bm​ 的平均值最大。
如此,便是和最佳牛围栏一样,选择一段连续的平均值最大的子区间,便确定了 bi 的选择。
同理,为了使得所有列之和的平均值最大,就是让a1+a2+...+ama_1+a_2+...+a_ma1​+a2​+...+am​ 的平均值最大。
矩阵中的所有元素的最大平均值便是 ai的最大平均值 + bi的最大平均值。

所以这道题就转化为了两道最佳牛围栏。

Code:

const int N = 200010, mod = 1e9+7;
int T, n, m;
double a[N],b[N];
double s[N],t[N];bool check(double a[],int n,int x,double mid)
{for(int i=1;i<=n;i++) t[i]=a[i]-mid;double mina=1e9,ans=-1;for(int i=1;i<=n;i++){s[i]=s[i-1]+t[i];if(i>=x){mina=min(mina,s[i-x]);ans=max(ans,s[i]-mina);}}if(ans>=0) return 1;return 0;
}int main(){int x,y;cin>>n>>m>>x>>y;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=m;i++) cin>>b[i];double l=0,r=1e9;while(r-l>1e-9){double mid=(l+r)/2;if(check(a,n,x,mid)) l=mid;else r=mid;}double ans=r;l=0,r=1e9;while(r-l>1e-9){double mid=(l+r)/2;if(check(b,m,y,mid)) l=mid;else r=mid;}printf("%.10f",ans+r);return 0;
}

C. Keshi Is Throwing a Party(二分答案),最/佳牛围栏,average。相关推荐

  1. Codeforces 1612C. Keshi Is Throwing a Party

    Codeforces 1612C. Keshi Is Throwing a Party 思路 首先容易发现,选择的人数具有单调性,是可以二分的 假设最后答案选了 xxx 个人,那么对于一个人有影响的, ...

  2. Codeforces 1610C Keshi Is Throwing a Party

    题意 Keshi有 nnn 个朋友,第 iii 个朋友有 iii 美元.如果邀请第 iii 个朋友做客,必须满足宴会上最多有 aia_iai​ 个人比他富有,最多 bib_ibi​ 个人比他贫穷. 问 ...

  3. Codeforces-1610 C: Keshi Is Throwing a Party

    Codeforces-1610 C: Keshi Is Throwing a Party 题目传送门:Codeforces-1610 C 题目 题目截图 样例描述 题目大意   Keshi 正在举行一 ...

  4. UVA1396 Most Distant Point from the Sea(AM - ICPC - Tokyo - 2007)(计算几何,半平面交 + 二分答案)

    整理的算法模板合集: ACM模板 题目传送门 见<训练指南>P279 很明显就是一个二分答案,它问的是最远的点,直接枚举因为这里都是double类型的数所以有无限个点,我们可以直接二分. ...

  5. UVA1146 / LA3211(ACM-ICPC 2004 Europe - Southwestern) Now or later(2-SAT问题 + 二分答案)

    题目要求为 最大化最小值,很明显就是二分答案. 题目中每个飞机 要么是一种状态(早),要么是另一种状态(晚),考虑 2-SAT. 我们二分答案,二分着陆时间间隔的最小值 x. 枚举每两个飞机 p , ...

  6. 解题报告:luoguP2868 Sightseeing Cows G(最优比率环,负环判定,二分答案)

    根据题意,我们要环上各点权值之和除以各边权值之和最大. 求最大答案,很明显可以使用二分答案.那么我们假设当前答案为 x,如果有更大的答案,那么方程就可以按下图转换: 也就是说如果有更大的答案,则有一个 ...

  7. P2759 奇怪的函数(二分答案,数学运算)

    P2759 奇怪的函数 范围2e92e92e9,直接枚举肯定超时,正着直接求答案求不出来,那么运用逆向思维,直接二分答案判断即可.这道题涉及简单的数学运算. 要xx>=nx^x>=nxx& ...

  8. P3743 kotori的设备(二分答案,思维,线性)难度⭐⭐⭐

    题目链接 题目背景 kotori 有 n 个可同时使用的设备. 题目描述 第 i 个设备每秒消耗ai个单位能量.能量的使用是连续的,也就是说能量不是某时刻突然消耗的,而是匀速消耗.也就是说,对于任意实 ...

  9. 【基础算法】二分法(二分答案,二分查找),三分法,Dinkelbach算法,算法详解+例题剖析

    目录 一 . 二分法 二分搜索得要求: 二分查找步骤: 二分答案: 玄学的二分(二分答案) 二 . 三分法 例题 三.01分数规划问题相关算法与题目讲解(二分法与Dinkelbach算法) 一 . 二 ...

最新文章

  1. 存储过程和存储函数初步
  2. SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】远程桌面 3389 Windows 2016
  3. MySQL数据类型简介
  4. boost::sort模块实现弦平面稳定测试
  5. Matlab第二章选择题填空题,matlab及其在大学物理中的应用第二章习题答案.doc
  6. Python全栈工程师(文件操作、编码)
  7. 排序算法——插入排序
  8. mysql行锁同索引键问题_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)
  9. javascript概要
  10. html 打开页面光标自动选中输入框_Python自动部署码云:
  11. python百题百练 二级题目_计算机二级选择题(公共基础新大纲)
  12. Jenkins在Linux环境安装
  13. python学到什么程度可以找到工作-月薪2万+的Python Web岗,学到什么程度能找到工作?...
  14. Sublime LiveReload
  15. 联想硬盘保护系统计算机名,联想硬盘保护系统的使用方法
  16. 图像处理之对比度增强
  17. 安卓txt极简记事本文件保存内部存储无广告
  18. 移植tslib,测试电容屏
  19. 【蓝桥杯每日一练:小z的序列游戏-k】
  20. XML Publisher介绍

热门文章

  1. 战胜人类最强大脑只是开始,百度大脑“代言”中国人工智能
  2. 数据结构与算法(C++) -- adjacency matrix
  3. android10系统是平板电脑吗,买平板电脑应该选win10还是安卓系统?
  4. FireBird Embedded学习日记
  5. js算法数组flat展平的几种方法
  6. 第十章:手机摄像头实现光学变焦的七种方法
  7. 计算机沟通管理技巧,语言沟通技巧
  8. 柯达i2400批量自动扫描仪 JoySailScan控件转出的Base64尾部永远多一个'/',将导致解码失败
  9. 自我觉知和自我知觉(self-perception)
  10. Flask学习笔记(一)