博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dropping tests
阅读量:6217 次
发布时间:2019-06-21

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

有n对数,记做\(\{a_i,b_i\}\),现在你只能不选择k对数,使选出来的数a之和除以b之和乘以100最大,\(1 \leq k ≤ n ≤ 1000\)

显然看到某某和除以某某和,就想到了分数规划,于是设

\[ans=\frac{\sum_{i=1}^nx_ia_i}{\sum_{i=1}^nx_ib_i}\]

所以二分式为

\[\sum_{i=1}^nx_i(a_i-ans\times b_i)\]

实际上问题即变成选出n-k对\((a_i-ans\times b_i)\)使之最大,于是我们最自然是考虑排序优化,而这个时间复杂度是我们所能接受的,接着按

照二分或者迭代去做即可。

参考代码:

二分

#include 
#include
#include
#define il inline#define ri register#define db double#define exact 0.00000001int n,k;db a[2001],b[2001],c[2001];using namespace std;il bool check(db);il db dfs(db,db);int main(){ int i,j; while(scanf("%d%d",&n,&k),n||k){ for(i=1;i<=n;++i)scanf("%lf",&a[i]); for(i=1;i<=n;++i)scanf("%lf",&b[i]); printf("%0.f\n",dfs(0,1)); } return 0;}il bool check(db s){ int i;db j(0); for(i=1;i<=n;++i)c[i]=a[i]-s*b[i]; sort(c+1,c+n+1);for(i=k+1;i<=n;++i)j+=c[i]; if(j>exact)return true;return false;}il db dfs(db l,db r){ db mid; while(r-l>exact){ mid=(l+r)/2; if(check(mid))l=mid+exact; else r=mid-exact; }return (l+r)*50;}

迭代

#include 
#include
#include
#define il inline#define ri register#define db double#define exact 0.00000001using namespace std;struct save{ db data;int id; il bool operator<(const save&x){ return data
exact)l=son/mom; else break; }printf("%.0f\n",l*100); } return 0;}

转载于:https://www.cnblogs.com/a1b3c7d9/p/10802919.html

你可能感兴趣的文章
Myeclipes快捷键
查看>>
我的友情链接
查看>>
ToRPC:一个双向RPC的Python实现
查看>>
netty框架的学习笔记 + 一个netty实现websocket通信案例
查看>>
我的友情链接
查看>>
nginx在reload时候报错invalid PID number
查看>>
神经网络和深度学习-第二周神经网络基础-第二节:Logistic回归
查看>>
Myeclipse代码提示及如何设置自动提示
查看>>
setTimeOut(),和setInterVal()调用函数加不加括号!!!
查看>>
c/c++中保留两位有效数字
查看>>
urlparse获取url后面的参数
查看>>
ElasticSearch 2 (32) - 信息聚合系列之范围限定
查看>>
VS2010远程调试C#程序
查看>>
notepad++正则表达式例子
查看>>
[MicroPython]TurniBit开发板DIY自动窗帘模拟系统
查看>>
由String类的Split方法所遇到的两个问题
查看>>
Python3.4 12306 2015年3月验证码识别
查看>>
从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)
查看>>
自制操作系统Antz day11——实现shell(下)命令响应
查看>>
windows查看端口占用
查看>>