二分,排序,贪心。

最优比率生成树,可以二分$+$贪心来实现,不过这样做精度不行。

如果是这样一个问题,该如何解决:问你$n$个里面选择$k$个,能否使得$\frac{{\sum\limits_{j = 1}^k {{v_{{i_j}}}} }}{{\sum\limits_{j = 1}^k {{w_{{i_j}}}} }} ≥ x$。

上述问题等价于问你:$n$个里面选择$k$个,能否使得$\sum\limits_{j = 1}^k {({v_{{i_j}}} - x×{w_{{i_j}}})}  ≥ 0$。

也就是说,我们需要令${f_i} = {v_i} - x×{w_i}$,按照${f_i}$从大到小排序,选择前$k$个计算和$sum$。

如果$sum≥0$,也就是说$\frac{{\sum\limits_{j = 1}^k {{v_{{i_j}}}} }}{{\sum\limits_{j = 1}^k {{w_{{i_j}}}} }} ≥ x$成立;否则不成立。

因为这个问题是遵循单调性的,$x$越大可能性越小,因此只要二分$x$,然后验证就可以了。时间复杂度$O(50*n*\log n)$。

特别要注意的是精度问题:

$[1].$计算$sum$的时候,最后要加上一个$eps$,我在这卡了很久精度。

$[2].$二分的话差不多$50$次就可以了,$100$次$TLE$了,也没有必要进行$100$次,因为实际上是只要$\log {10^7}$次。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c = getchar(); x = ;while(!isdigit(c)) c = getchar();
while(isdigit(c)) { x = x * + c - ''; c = getchar(); }
} const int maxn=;
struct X { int v,w;}s[maxn];
int n,k,ans[maxn];
struct XX {double num; int id;}t[maxn];
double Max; bool cmp(XX a,XX b){ return a.num>b.num; } bool check(double x)
{
for(int i=;i<=n;i++)
{
t[i].num=1.0*s[i].v-x*s[i].w;
t[i].id=i;
}
sort(t+,t++n,cmp); double sum=;
for(int i=;i<=k;i++) sum=sum+t[i].num; if(sum+eps>=)
{
for(int i=;i<=k;i++) ans[i]=t[i].id;
return ;
}
return ;
} int main()
{
while(~scanf("%d%d",&n,&k))
{
for(int i=;i<=n;i++)
scanf("%d%d",&s[i].v,&s[i].w); double L=0.0,R=10000000.0;
int t=;
while(t--)
{
double mid=(L+R)/;
if(check(mid)) L=mid;
else R=mid;
} for(int i=;i<=k;i++)
{
printf("%d",ans[i]);
if(i<k) printf(" "); else printf("\n");
}
}
return ;
}

最新文章

  1. Leetcode 259. 3Sum Smaller
  2. Linux命令学习总结:rmdir
  3. Linux内核@系统组成与内核配置编译
  4. HTML流动布局各种宽度自适应
  5. Newtonsoft.Json中的时间格式详解.
  6. Unity3D性能优化--- 收集整理的一堆
  7. C# 将文件转化成byte[]数组
  8. BZOJ2093 : [Poi2010]Frog
  9. Drupal 7.23:函数module_invoke_all()注释
  10. 20141104--SQL,查询习题,约束
  11. git之环境配置(window+git+github)
  12. 启用VSFTPD日志及其解读
  13. Xml读取异常--Invalid byte 1 of 1-byte UTF-8 sequence
  14. hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别
  15. Pet(dfs+vector)
  16. c语言libcurl 使用实例get/post方法+c语言字符串处理
  17. IOS 使用动态库(dylib)和动态加载framework
  18. AtCoder Regular Contest 076
  19. Android or Java的回调粗俗理解 这才是最通俗易懂的
  20. 免登陆下载jdk

热门文章

  1. 【IOS开发】如何画1像素的线
  2. Knockout 是什么?
  3. (翻译) Android Accounts Api使用指南
  4. Spring整合Hibernate笔记
  5. Go Revel - Parameters(参数绑定)
  6. .NET中 类型,对象,线程栈,托管堆在运行时的关系
  7. spring实现数据库读写分离
  8. Mac下quick-cocos2d-x player 无法运行解决方案
  9. linux 原生系统发送电子邮件 (在本地与因特网)
  10. sftp 服务器外网访问设置