AtCoder 1807 食塩水
题意
有 \(n\) 瓶食盐水,第 \(i\) 瓶为质量 \(w_i\),浓度 \(p_i\%\) 的食盐水,需要选出 \(k\) 瓶食盐水混合在一起,问最大浓度。
\(\texttt{Data Range:}1\leq n,k\leq 1000\)
题解
二分答案。
一开始在想各种贪心,然后各种贪心都假了,但是注意到这个东西是有单调性,(如果存在一种方案混合出来的食盐水浓度大于 \(p\) 那么也一定存在一种方案的浓度大于比 \(p\) 小的值),所以可以二分答案变成判定性问题。
现在考虑能不能选出 \(k\) 瓶食盐水混合起来浓度大于某个二分到的 \(p\),也即:
\]
乘过去再移过来
\]
所以说我们只需要对 \(w_i(p_i-p)\) 排序然后贪心选最大的 \(k\) 个即可,实现可能有一些细节需要注意。
代码
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
typedef long double db;
const ll MAXN=2e5+51;
const db eps=1e-10;
struct Node{
    ll p,w;
};
Node x[MAXN];
ll n,kk;
db l,r,mid;
db c[MAXN];
inline ll read()
{
    register ll num=0,neg=1;
    register char ch=getchar();
    while(!isdigit(ch)&&ch!='-')
    {
        ch=getchar();
    }
    if(ch=='-')
    {
        neg=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        num=(num<<3)+(num<<1)+(ch-'0');
        ch=getchar();
    }
    return num*neg;
}
inline ll check(db mid)
{
    db c2=0;
    for(register int i=1;i<=n;i++)
    {
        c[i]=(x[i].p-mid)*x[i].w;
    }
    sort(c+1,c+n+1,greater<db>());
    for(register int i=1;i<=kk;i++)
    {
        c2+=c[i];
    }
    return c2>=0;
}
int main()
{
    n=read(),kk=read(),l=0,r=100;
    for(register int i=1;i<=n;i++)
    {
        x[i].w=read(),x[i].p=read();
    }
    while(r-l>=eps)
    {
        mid=(l+r)/2;
        check(mid)?l=mid:r=mid;
    }
    printf("%.9Lf\n",l);
}
AtCoder 1807 食塩水的更多相关文章
- Iroha and a Grid AtCoder - 1974(思维水题)
		就是一个组合数水题 偷个图 去掉阴影部分 把整个图看成上下两个矩形 对于上面的矩形求出起点到每个绿点的方案 对于下面的矩形 求出每个绿点到终点的方案 上下两个绿点的方案相乘后相加 就是了 想想为什么 ... 
- 【AtCoder】AtCoder Grand Contest 035 解题报告
		点此进入比赛 \(A\):XOR Circle(点此看题面) 大致题意: 给你\(n\)个数,问是否能将它们摆成一个环,使得环上每个位置都是其相邻两个位置上值的异或值. 先不考虑\(0\),我们假设环 ... 
- 医院里的CR、DR、CT、磁共振、B超都是什么?
		转自 百度知道MR CT CR DR DSA X线 都事医学影像疾病诊断的一种. MRI 是磁共振影像检查,可以获得横断面,矢状面和冠状面的影像.空间分辩率好. CT 是一种X线诊断设备,是一种复杂的 ... 
- [atARC058F]Lroha Loves Strings
		贪心,求出前$i$个字符串所能组成的字典序最小的字符串$ans$(特别的,这里的字典序有$ab>abc$),同时保证剩下的长度能通过$l_{i+1},...,l_{n}$拼接 考虑插入一个字符串 ... 
- Atcoder 水题选做
		为什么是水题选做呢?因为我只会水题啊 ( 为什么是$Atcoder$呢?因为暑假学长来讲课的时候讲了三件事:不要用洛谷,不要用dev-c++,不要用单步调试.$bzoj$太难了,$Topcoder$整 ... 
- AtCoder Beginner Contest 069【A,水,B,水,C,数学,D,暴力】
		A - K-City Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement In K-city, ... 
- AtCoder Beginner Contest 022 A.Best Body 水题
		Best Body Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://abc022.contest.atcoder.jp/tasks/abc02 ... 
- BZOJ USACO 银组 水题集锦
		最近刷银组刷得好欢快,好像都是水题,在这里吧他们都记录一下吧(都是水题大家一定是道道都虐的把= =)几道比较神奇的题到时再列出来单独讲一下吧= =(其实我会说是BZOJ蹦了无聊再来写的么 = =) [ ... 
- 3410: [Usaco2009 Dec]Selfish Grazing 自私的食草者
		3410: [Usaco2009 Dec]Selfish Grazing 自私的食草者 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 71 Solve ... 
随机推荐
- 2020 巅峰极客 WP_ Re
			第一题:virus 是一个win32 的题,没给加壳. 主函数: int __cdecl main(int argc, const char **argv, const char **envp) { ... 
- Centos-链接-ln
			ln 用来在文件或者目录之间创建链接,分为软链接和硬链接,硬链接依据文件的inode来进行链接,linux系统中允许存在多个inode号,文件真正的删除,是指向这个文件block的inode为0则该数 ... 
- 【数量技术宅|量化投资策略系列分享】股指期货IF分钟波动率统计策略
			更多精彩内容,欢迎关注公众号:数量技术宅.想要获取完整策略代码,请加技术宅微信:sljsz01 股指期货分钟级别波动率观察 在A股市场,股指期货是由一揽子股票组成的股票现货指数,所对应的期货.由于期货 ... 
- 基础篇:深入解析JAVA注解机制
			目录 java实现注解的底层原理和概念 五种元注解详解 使用动态代理机制处理注解 spring.AOP和注解机制 (题外)@FunctionalInterface原理介绍 欢迎指正文中错误 关注公众号 ... 
- Arduino读取写入电压值
			读取写入方式分为数字和模拟 读取方式:(注意接地) 数字:digitalRead(pin); 模拟:analogRead(A1);float val=value*(5.0/1023.0); ... 
- k8s的namespace一直Terminating的完美解决方案
			k8s的namespace一直Terminating的完美解决方案 在k8s集群中进行测试删除namespace是经常的事件,而为了方便操作,一般都是直接对整个名称空间进行删除操作. 相信道友们在进行 ... 
- MySQL基础 :基本知识点大纲
- CentOS7.7 系统下 virbr0 虚拟网卡的维护与管理
			在 CentOS 7 系统的安装过程中,如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的 virbr0 网卡,这个是因为在虚拟化中有使用到 libvirtd 服务生 ... 
- css做模糊处理
			-webkit-filter: blur(9px); filter: blur(9px); 
- 用网桥和veth实现容器的桥接模式
			原理图如下 具体命令先不写了,有时间再写,主要还是用的上一篇说的知识. 
