[POJ2976] Dropping tests
传送门:>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的更多相关文章
- POJ2976 Dropping tests(二分+精度问题)
---恢复内容开始--- POJ2976 Dropping tests 这个题就是大白P144页的一个变形,二分枚举x,对a[i]-x*b[i]从大到小进行排序,选取前n-k个判断和是否大于等于0,若 ...
- POJ2976 Dropping tests —— 01分数规划 二分法
题目链接:http://poj.org/problem?id=2976 Dropping tests Time Limit: 1000MS Memory Limit: 65536K Total S ...
- poj2976 Dropping tests(01分数规划 好题)
https://vjudge.net/problem/POJ-2976 又是一波c++AC,g++WA的题.. 先推导公式:由题意得 Σa[i]/Σb[i]<=x,二分求最大x.化简为Σ(a[i ...
- POJ2976 Dropping tests(01分数规划)
题目大概说给n个二元组Ai和Bi,要去掉k个,求余下的100*∑Ai/∑Bi的最大值. 假设要的最大的值是ans,令Di=Ai-ans*∑Bi,对Di排序取最大的n-k个,如果∑Ai-ans*∑Bi& ...
- POJ2976 Dropping tests 01分数规划
裸题 看分析请戳这里:http://blog.csdn.net/hhaile/article/details/8883652 #include<stdio.h> #include<a ...
- [poj2976]Dropping tests(01分数规划,转化为二分解决或Dinkelbach算法)
题意:有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式.的最大值 解题关键:01分数规划,double类型二分的写法(poj崩溃,未提交) 或者r-l<=1e-3(右 ...
- POJ2976 Dropping tests(01分数规划)
题意 给你n次测试的得分情况b[i]代表第i次测试的总分,a[i]代表实际得分. 你可以取消k次测试,得剩下的测试中的分数为 问分数的最大值为多少. 题解 裸的01规划. 然后ans没有清0坑我半天. ...
- 【POJ2976】Dropping Tests(分数规划)
[POJ2976]Dropping Tests(分数规划) 题面 Vjudge 翻译在\(Vjudge\)上有(而且很皮) 题解 简单的\(01\)分数规划 需要我们做的是最大化\(\frac{\su ...
- Dropping tests(01分数规划)
Dropping tests Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8176 Accepted: 2862 De ...
随机推荐
- *args **kwargs
-----------耐得住寂寞,守得住芳华. # # -------------------------------[day10作业及默写]----------------------------- ...
- python 获取lazada菲律宾站地址库
import urllib3 import requests import ast import time # 因为lazada返回的数据是json类型,通过解码成字符串类型,为了方便数据操作,使用字 ...
- 1168: mxh对lfx的询问(前缀和+素数表)
题目描述: AS WE ALL KNOW, lfx是咱们组的神仙,但是mxh想考一考lfx一个简单的问题,以此看一下lfx到底是不是神仙.但是lfx要准备补考,于是请你来帮忙回答问题: 给定一个整数N ...
- Vue基本使用和指令集
Vue的使用 一.安装 对于新手来说,强烈建议大家使用<script>引入: 二. 引入vue.js文件 我们能发现,引入vue.js文件之后,Vue被注册为一个全局的变量,它是一个构造函 ...
- sqlserver笔记
表结构: 一,字段类型sqlserver jdbc java char char Stringnchar nchar Stringvarchar varchar Stringnvarchar nvar ...
- asp.net mvc Areas 母版页动态获取数据进行渲染
经常需要将一些通用的页面元素抽离出来制作成母版页,但是这里的元素一般都是些基本元素,即不需要 进行后台数据交换的基本数据,但是对于一些需要通过后台查询的数据,我们应该怎么传递给前台的母版页呢 这里描述 ...
- fastclick的介绍和使用
移动端点击延迟事件 1. 移动端浏览器在派发点击事件的时候,通常会出现300ms左右的延迟 2. 原因: 移动端的双击会缩放导致click判断延迟 解决方式 1. 禁用缩放 `<meta nam ...
- echo "" > 和 echo "" >> 的区别
在写shell脚本中,如果判断一个文件已经存在,但希望重写这个文件,一般用如下方式 echo "" > file.txt 这个表示清空文件的内容,如果使用 echo “” & ...
- 阿里p3c(代码规范,eclipse插件、模版,idea插件)
阿里p3c 一.说明 代码规范检查插件p3c,是根据<阿里巴巴Java开发手册>转化而成的自动化插件. (高级黑:P-3C“Orion”,反潜巡逻机,阿里大概取p3c先进,监测,发现潜在问 ...
- dbexpress连接mysql提示Operation not allowed on a unidirectional dataset
最近刚接触delphi,在了解到dbExpress连接mysql的时候,出现了一些问题,特记录下 我遇到的问题有两个 1. TDBGrid --DataSet=TDataSource1 TDataSo ...