01分数划分详情可阅读:http://www.cnblogs.com/perseawe/archive/2012/05/03/01fsgh.html

题意:

给出n个a和b,让选出n-k个使得最大

二分法:

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<queue>
  4. #include<cstring>
  5. #include<string>
  6. #include<map>
  7. #include<vector>
  8. #include<algorithm>
  9. #define rep(i,a,b) for(int i = a; i < b; i++)
  10. #define _rep(i,a,b) for(int i = a; i <= b; i++)
  11. using namespace std;
  12. const int maxn = + ;
  13. const double inf = 1e9;
  14. const double eps = 1e-;
  15. double a[maxn] , b[maxn], d[maxn];
  16. int n, k;
  17. double check(double L){
  18. double sum = ;
  19. for(int i = ; i < n; i++) d[i] = a[i] - b[i] * L;
  20. sort(d,d+n);//由于都是可取的, 那么就取最大的k个, 使得F(L)尽量大
  21. rep(i,k,n) sum += d[i];
  22. return sum;
  23. }
  24. int main()
  25. {
  26. while(~scanf("%d %d", &n, &k) && n){
  27. rep(i,,n)scanf("%lf", &a[i]);
  28. rep(i,,n)scanf("%lf", &b[i]);
  29. double L = inf, R = -inf, Mid;
  30. for(int i = ;i < n; i++){
  31. L = min(a[i]/b[i], L); //如果求某些分数分子分母分别相加和最大, 那么这个和肯定小于等于某个分数
  32. R = max(a[i]/b[i], R); //如果求某些分数分子分母分别相加和最小, 那么这个和肯定小于等于某个分数
  33. }
  34. while( R - L > eps){
  35. Mid = L + (R-L)/;
  36. if(check(Mid) > ) //检查这个L值是否使F(L) = sigma(a[i] - L*b[i]) * ki取值为0(ki是取的k个数)
  37. L = Mid;
  38. else
  39. R = Mid;
  40.  
  41. }
  42. printf("%.0f\n", L * );
  43. }
  44. return ;
  45. }

Dinkelbach

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<queue>
  4. #include<cstring>
  5. #include<string>
  6. #include<map>
  7. #include<vector>
  8. #include<algorithm>
  9. #include<cmath>
  10. #define rep(i,a,b) for(int i = a; i < b; i++)
  11. #define _rep(i,a,b) for(int i = a; i <= b; i++)
  12. using namespace std;
  13. const int maxn = + ;
  14. const double inf = 1e9;
  15. const double eps = 1e-;
  16. struct node{
  17. double a, b, d;
  18. bool operator <(const node& x ) const{
  19. return d < x.d;
  20. }
  21. }arr[maxn];
  22. int n, k;
  23. double Dinkelbach()
  24. {
  25. double L,ans=; //L一开始随机赋值
  26. double x,y;
  27. while(){
  28. L = ans;
  29. for(int i=;i<n;i++)
  30. arr[i].d = arr[i].a - L * arr[i].b;
  31. sort(arr, arr + n);
  32. x=y=;
  33. for(int i=k;i<n;i++){
  34. x+=arr[i].a;
  35. y+=arr[i].b;
  36. }
  37. ans=x/y;//保存结果
  38. // printf("%.16f\n", ans);
  39. if(abs(L-ans) < eps) return L;
  40. }
  41. }
  42. int main()
  43. {
  44. // freopen("1.txt","r", stdin);
  45. while(~scanf("%d %d", &n, &k) && n){
  46. rep(i,,n)scanf("%lf", &arr[i].a);
  47. rep(i,,n)scanf("%lf", &arr[i].b);
  48. printf("%.0f\n", Dinkelbach()* );
  49. }
  50. return ;
  51. }

POJ 2976 Dropping test(01分数规划模板)的更多相关文章

  1. POJ 2976 Dropping tests 01分数规划 模板

    Dropping tests   Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6373   Accepted: 2198 ...

  2. POJ 2976 Dropping tests 01分数规划

    给出n(n<=1000)个考试的成绩ai和满分bi,要求去掉k个考试成绩,使得剩下的∑ai/∑bi*100最大并输出. 典型的01分数规划 要使∑ai/∑bi最大,不妨设ans=∑ai/∑bi, ...

  3. $POJ$2976 $Dropping\ tests$ 01分数规划+贪心

    正解:01分数规划 解题报告: 传送门! 板子题鸭,,, 显然考虑变成$a[i]-mid\cdot b[i]$,显然无脑贪心下得选出最大的$k$个然后判断是否大于0就好(,,,这么弱智真的算贪心嘛$T ...

  4. POJ - 2976 Dropping tests(01分数规划---二分(最大化平均值))

    题意:有n组ai和bi,要求去掉k组,使下式值最大. 分析: 1.此题是典型的01分数规划. 01分数规划:给定两个数组,a[i]表示选取i的可以得到的价值,b[i]表示选取i的代价.x[i]=1代表 ...

  5. POJ 2976 Dropping tests(分数规划)

    http://poj.org/problem?id=2976 题意: 给出ai和bi,ai和bi是一一配对的,现在可以删除k对,使得的值最大. 思路: 分数规划题,可以参考<挑战程序竞赛> ...

  6. [poj 2976] Dropping tests (分数规划 二分)

    原题: 传送门 题意: 给出n个a和b,让选出n-k个使得(sigma a[i])/(sigma b[i])最大 直接用分数规划.. code: //By Menteur_Hxy #include & ...

  7. POJ 2976 裸的01分数规划

    题意:给你n个数对(认为是a数组和b数组吧),从中取n-m个数对,如果选第i个数对,定义x[i]=1,求R=∑(a[i]*x[i])/∑(b[i]*x[i])取得最大值时R的值.输出R*100(保留到 ...

  8. POJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)

    [题意]每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树. 标准的最优比率生成树,楼教主当年开场随手1YES然后把别人带错方向的题Orz ...

  9. Dropping tests(01分数规划)

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

  10. POJ 2728 Desert King (01分数规划)

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions:29775   Accepted: 8192 Descr ...

随机推荐

  1. win32 寄存器

    跳转指令分三类: 一.无条件跳转: JMP ;无条件跳转 二.根据CX.ECX寄存器的值跳转: JCXZ ;CX 为 0 则跳转 JECXZ;ECX 为 0 则跳转 三.根据EFLAGS寄存器的PSW ...

  2. Codeforces Round #544 (Div. 3) D. Zero Quantity Maximization

    链接:https://codeforces.com/contest/1133/problem/D 题意: 给两个数组a,b. 同时ci = ai * d + bi. 找到一个d使c数组中的0最多. 求 ...

  3. 学习JavaScript数据结构与算法 (二)

    学习JavaScript数据结构与算法 的笔记 包含第四章队列, 第五章链表 本人所有文章首发在博客园: http://www.cnblogs.com/zhangrunhao/ 04队列 实现基本队列 ...

  4. 1-20StringBuffer简介

    StringBuffer是一个字符串缓冲区,如果需要频繁的对字符串进行拼接时,建议使用StringBuffer. 工作原理 StringBuffer的底层是char数组,如果没有明确设定,则系统会默认 ...

  5. httpclient 3.1跳过https请求SSL的验证

    一.因为在使用https发送请求的时候会涉及,验证方式.但是这种方式在使用的时候很不方便.特别是在请求外部接口的时候,所以这我写了一个跳过验证的方式.(供参考) 二.加入包,这里用的是commons- ...

  6. Super Mario 树状数组离线 || 线段树

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. Error: IO_ERROR : java.io.IOException: Error while connecting Oozie server. No of retries = 5. Exception = Connection refused (Connection refused)解决办法(图文详解)

    不多说,直接上干货! 问题详情 解决办法 Copy/Paste oozie.services property tag set from oozie-default.xml to oozie-site ...

  8. Suricata的Reputation

    见官网 https://suricata.readthedocs.io/en/latest/reputation/index.html Docs » 9. Reputation Edit on Git ...

  9. P1615 西游记公司

    题目背景 一道极其无厘头的题目 题目描述 事情是这样的:西游记中的孙沙猪(孙杀猪)三徒弟在西天取经之后开始进入厦门大学经贸系学习经济,在1个小时的学习后,他们用暴力手段毕业了.然后,他们创办了三个公司 ...

  10. 访问github.com太慢的解决方法

    修改 c:\windows\system32\drivers\etc\host文件添加 192.30.255.112 github.com 151.101.72.249 github.global.s ...