传送门:>Here<

题意:给出长度相等的数组a和b,定义他们的和为$\dfrac{a_1+a_2+...+a_n}{b_1+b_2+...+b_n}$。现在可以舍弃k对元素(一对即$a[i]和b[i]$),问最大的和是多少?

解题思路

01分数规划入门题(并没有学过,看到hy大佬在刷因此也去学了下)

问题可以转化为数组中的每个元素选或不选,也就可以认为每一个元素都乘上一个$x[i], \ x[i] ∈ \{0, 1\}$

因此问题可以转化为$ans = \dfrac{\sum\limits_{i = 1}^{n}a[i] * x[i]}{\sum\limits_{i = 1}^{n}b[i] * x[i]}$

将除法转化为加法$\sum\limits_{i = 1}^{n}a[i] * x[i] - ans * \sum\limits_{i = 1}^{n}b[i] * x[i] = 0$

合并得$\sum\limits_{i = 1}^{n}(a[i]-ans*b[i])*x[i] = 0$

当$x$数组的取值确定时,可以发现函数$f(r) = \sum\limits_{i = 1}^{n}(a[i]-r*b[i])*x[i]$是减函数,因此可以二分$r$。当前取到的$r$能够满足$\sum\limits_{i = 1}^{n}(a[i]-r*b[i])*x[i] \geq 0$即为可行,为了满足此条件,肯定要让选择的那些元素的和越大越好,因此可以建立数组$d[i] = a[i]-r*b[i]$并排序,选择最大的加起来验证是否大于等于0.

Code

long long

/*By DennyQi 2018.8.12*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define r read()
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
using namespace std;
typedef long long ll;
#define int long long
const int MAXN = ;
const int MAXM = ;
const int INF = ;
inline int read(){
int x = ; int w = ; register int c = getchar();
while(c ^ '-' && (c < '' || c > '')) c = getchar();
if(c == '-') w = -, c = getchar();
while(c >= '' && c <= '') x = (x << ) + (x << ) + c - '', c = getchar(); return x * w;
}
struct Score{
int idx; double sc;
}s[MAXN];
int N,K;
int a[MAXN],b[MAXN];
double L,R,Mid,d[MAXN];
inline bool comp(const Score& a, const Score& b){
return a.sc < b.sc;
}
inline bool judge(double _r){
for(int i = ; i <= N; ++i){
d[i] = (double)((double)(a[i]) - (double)(1.0*_r*b[i]));
}
sort(d+,d+N+);
double res = 0.0;
for(int i = N; i > K; --i){
res += d[i];
}
return res >= 0.0;
}
#undef int
int main(){
#define int long long
for(;;){
N = r, K = r;
if(!N && !K) break;
for(int i = ; i <= N; ++i) a[i] = r;
for(int i = ; i <= N; ++i) b[i] = r;
L = 0.000, R = 9999999999.999;
while(R - L >= 1e-){
Mid = (L + R) / 2.000;
if(judge(Mid)){
L = Mid;
}
else{
R = Mid;
}
}
for(int i = ; i <= N; ++i){
s[i] = (Score){i, (double)((double)(a[i]) - (double)(1.0*L*b[i]))};
}
sort(s+,s+N+,comp);
int fz=,fm=;
for(int i = N; i > K; --i){
fz += a[s[i].idx];
fm += b[s[i].idx];
}
double rs = (double)fz/(double)fm;
printf("%.0f\n", rs * );
}
return ;
}

[POJ2976] Dropping tests的更多相关文章

  1. POJ2976 Dropping tests(二分+精度问题)

    ---恢复内容开始--- POJ2976 Dropping tests 这个题就是大白P144页的一个变形,二分枚举x,对a[i]-x*b[i]从大到小进行排序,选取前n-k个判断和是否大于等于0,若 ...

  2. POJ2976 Dropping tests —— 01分数规划 二分法

    题目链接:http://poj.org/problem?id=2976 Dropping tests Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  3. poj2976 Dropping tests(01分数规划 好题)

    https://vjudge.net/problem/POJ-2976 又是一波c++AC,g++WA的题.. 先推导公式:由题意得 Σa[i]/Σb[i]<=x,二分求最大x.化简为Σ(a[i ...

  4. POJ2976 Dropping tests(01分数规划)

    题目大概说给n个二元组Ai和Bi,要去掉k个,求余下的100*∑Ai/∑Bi的最大值. 假设要的最大的值是ans,令Di=Ai-ans*∑Bi,对Di排序取最大的n-k个,如果∑Ai-ans*∑Bi& ...

  5. POJ2976 Dropping tests 01分数规划

    裸题 看分析请戳这里:http://blog.csdn.net/hhaile/article/details/8883652 #include<stdio.h> #include<a ...

  6. [poj2976]Dropping tests(01分数规划,转化为二分解决或Dinkelbach算法)

    题意:有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式.的最大值 解题关键:01分数规划,double类型二分的写法(poj崩溃,未提交) 或者r-l<=1e-3(右 ...

  7. POJ2976 Dropping tests(01分数规划)

    题意 给你n次测试的得分情况b[i]代表第i次测试的总分,a[i]代表实际得分. 你可以取消k次测试,得剩下的测试中的分数为 问分数的最大值为多少. 题解 裸的01规划. 然后ans没有清0坑我半天. ...

  8. 【POJ2976】Dropping Tests(分数规划)

    [POJ2976]Dropping Tests(分数规划) 题面 Vjudge 翻译在\(Vjudge\)上有(而且很皮) 题解 简单的\(01\)分数规划 需要我们做的是最大化\(\frac{\su ...

  9. Dropping tests(01分数规划)

    Dropping tests Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8176   Accepted: 2862 De ...

随机推荐

  1. Wechart 饼图

    预览 Preview | Usage Source | Pie Source | Tutorial Wechart by Cax Cax 众所周知 Cax 既能开发游戏.又能开发图表.本文将从饼图开始 ...

  2. plw的骰子

    链接 [http://murphyc.fun/problem/4007] 题意 描述 duxing2016有一个神奇的骰子,投出1-6的概率为(p1,p2...p6) 现在他投n次骰子,问投出点数和大 ...

  3. PS绘制扁平化风格相机镜头UI图标

    一.新建一个画布,绘制一个460*460图层,圆角半径40像素.填充渐变颜色,加一点点投影,这样就有质感了. 二.接下来我们要来绘制主体部分,绘制一个圆,大小400*400,用内阴影,渐变叠加,投影得 ...

  4. Golang 字符串操作--使用strings、strconv包

    strings包 package main import ( "fmt" "strings" ) func main() { //func Count(s, s ...

  5. Day 4-2 time & datetime模块

    time模块. import time time.time() #输出: 1523195163.140625 time.localtime() # 获取的是操作系统的时间,可以添加一个时间戳参数 # ...

  6. API知识点总结

    一.开发api接口开放给其他人调用的api接口(短信接口,支付宝api) 二.api安全弱点数据窃取(解决加密),数据篡改(解决MD5),数据泄露(爬虫技术)(解决令牌)1.加密(HTTPS传输-收费 ...

  7. Flutter之 LimitedBox、Offstage、OverflowBox、SizedBox详解

    1. LimitedBox A box that limits its size only when it's unconstrained. 1.1 简介 LimitedBox,通过字面意思,也可以猜 ...

  8. Swagger2常用注解及其说明 (转)

    Api 用在Controller中,标记一个Controller作为swagger的文档资源 属性名称 说明 value Controller的注解 description 对api资源的描述 hid ...

  9. CentOS7学习

    1.为什么学linux? linux开源免费,系统稳定,多用户的操作系统. linux有许多版本,各个版本之间的不同点大概分三种? > 内核不同 > 集成不同的应用 > 定制不同的图 ...

  10. Airflow 使用随笔(内含 TimeZone 和 Backfill 等的详解)

    其实怎么部署  airflow 又哪些特性,然后功能又是如何全面都可以在 Reference 的文章里面找到,都不是重点这里就不赘述了. 这里重点谈一下我在部署完成仔细阅读文档之后觉得可以总结的一些东 ...