博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【POJ2976】Dropping tests (01分数规划入门题)
阅读量:4316 次
发布时间:2019-06-06

本文共 1215 字,大约阅读时间需要 4 分钟。

(小声bb:话说好像下周就可以停课了(flag)!终于可以去见学长们啦~ 虽然月考挂了

在这里学习的分数规划——>

简单总结一下

设函数f(r)=sigma(a[i]*x[i])-r*sigma(b[i]*x[i])

变形 f(r)=sigma((a[i]-r*b[i])*x[i])

假如r已知 若预处理出d[i]=a[i]-r*b[i] 那式子就变得很简洁了 f(r)=sigma(d[i]*x[i]) 

我们分析一下f(r) 假设f(r)>0 会发生什么呢? 代回原式

即sigma(a[i]*x[i])/sigma(b[i]*x[i])>r

这说明还有另一个解比当前的r好!

所以满足二分的性质 那么若f(r)<0 此f(r)<0是没有意义的,因为这时候的r是不能够被取得的

然后就没了 对于二分的check 这道题只需要把所有d排序 找前k个最优的 QWQ

#include
#include
#include
#include
#define N 1005#define eps 1e-7using namespace std;int n,k;double a[N],b[N],d[N];inline double check(double num){ for(int i=1;i<=n;i++) d[i]=a[i]-num*b[i]; sort(d+1,d+n+1); double ans=0; for(int i=k+1;i<=n;i++) ans+=d[i]; return ans;}int main(){ while(scanf("%d%d",&n,&k),n||k) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(d,0,sizeof(d)); for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i]; double l=0,r=1000,m; while(l+eps
0) l=m; else r=m; } printf("%.0lf\n",m*100); } return 0;}

 

转载于:https://www.cnblogs.com/Patrickpwq/articles/9775703.html

你可能感兴趣的文章
【机器学习】Learning to Rank 简介
查看>>
Unity 使用实体类
查看>>
MySQL常见注意事项及优化
查看>>
流畅的Python (Fluent Python) —— 前言
查看>>
Jquery-menu-aim流畅的菜单滑动体验
查看>>
Jquery EasyUI修改行背景的两种方式
查看>>
嵌入式Linux学习笔记(0)基础命令。——Arvin
查看>>
二分图匹配
查看>>
c++ 模板template
查看>>
CString的成员函数详解
查看>>
Appium Studio 初体验(windows做ios自动化,录制appium脚本)
查看>>
Linux常用命令
查看>>
整体二分&cdq分治 ZOJ 2112 Dynamic Rankings
查看>>
【POJ2976】Dropping tests (01分数规划入门题)
查看>>
通过正则表达式获取url中参数
查看>>
cxx signal信号捕获
查看>>
《Android开发艺术探索》读书笔记——Cha3.2.3改变布局参数实现View的滑动
查看>>
python闭包与装饰器
查看>>
Acegi 源码解释
查看>>
Activity的几种启动跳转方式
查看>>