[POJ 2976]Dropping tests(0-1分数规划)

[POJ 2976]Dropping tests(0-1分数规划)

大家好,又见面了,我是全栈君。

  1. 题目地址:http://poj.org/problem?

    id=2976

  2. 题目大意:给你n个物品的a值和b值,要你从中丢掉k个(或者说选择n-k个)物品,使得剩下的物品的[POJ 2976]Dropping tests(0-1分数规划)最大
  3. 题目思路(以下思路转自http://blog.csdn.net/neofung/article/details/7649603):

    我们能够看看例如以下推导

    [POJ 2976]Dropping tests(0-1分数规划)

    题目就变成了二分检索r

  4. 代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <algorithm>
    #include <cmath>
    
    #define MAXN 1010
    #define EPS (1e-6)
    #define INF 0x3f3f3f3f
    
    using namespace std;
    
    double w[MAXN],v[MAXN];
    int n,k;
    double value[MAXN];
    
    bool check(double x) //推断平均值x是否可取
    {
    	double sum=0;
    	for(int i=1;i<=n;i++)
    		value[i]=v[i]-x*w[i];
    	sort(value+1,value+n+1); //贪心排序,从大到小选取k个value[i],且这k个value的和必须不小于0
    	for(int i=n;i>=n-k+1;i--)
    		sum+=value[i];
    	return sum>=0;
    }
    
    int main()
    {
    	while(scanf("%d%d",&n,&k)!=EOF&&!(n==0&&k==0))
    	{
    	    k=n-k;
    		for(int i=1;i<=n;i++)
    			scanf("%lf",&v[i]);
    		for(int i=1;i<=n;i++)
    			scanf("%lf",&w[i]);
    		double lowerBound=0,upperBound=INF; //二分这个平均值
    		while(fabs(upperBound-lowerBound)>EPS)
    		{
    			double mid=(lowerBound+upperBound)/2;
    			if(check(mid)) lowerBound=mid;
    			else upperBound=mid;
    		}
    		printf("%.f\n",100*upperBound);
    	}
    	return 0;
    }
    


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115619.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • OriginPro绘图过程中遇到的问题及解决办法

    OriginPro绘图过程中遇到的问题及解决办法y轴标题如何只显示单位不显示长名称?选中坐标轴标题,右击,选择属性,将文本内容由%(?Y)改为%(?Y,@lu),即可。此为软件内部代码,可以正常使用。

  • lldp协议代码阅读_LLDP(链路层发现协议)和OpenFlow

    lldp协议代码阅读_LLDP(链路层发现协议)和OpenFlow1.LLDP(链路层发现协议)机制链路层发现协议(LLDP)是一个厂商无关的二层协议,它允许网络设备在本地子网中通告自己的设备标识和性能。它提供了一种标准的链路层发现方式。LLDP协议使得接入网络的一台设备的主要能力,管理地址,设备标识,接口标识等信息发送给同一个局域网的其他设备,当一个设备从网络中接收到其它设备的信息时,就将这些信息以MIB的形式存储起来。1.1LLDP结构LLDP是一个信息发…

  • 软件测试_笔记(完整版)[通俗易懂]

    软件测试_笔记(完整版)[通俗易懂]软件测试复习(部分)概述程序+文档+数据=软件狭义的软件测试定义:为发现软件缺陷而执行程序或系统的过程广义的软件测试定义:人工或自动地运行或测定某系统的过程,目的在于检验它是否满足规定的需求或弄清预期结果和实际结果间的差别为什么要做软件测试发现软件缺陷功能错功能遗漏超出需求部分(画蛇添足)性能不符合要求软件质量高低:是否符合用户习惯、符合用户需求测试…

  • pycharm打开闪退_手机微信闪退怎么回事

    pycharm打开闪退_手机微信闪退怎么回事我清了浏览记录也没用感觉这2个方法靠谱点,还没用过设置里面:选择高级-时间限然后开始清理或者设置面板中点高级-重置并清理或者重启https://jingyan.baidu.com/article/eb9f7b6dbfa6f6c79264e844.html…

  • ubuntu16.04 安装 dstat,使用 报错「建议收藏」

    ubuntu16.04 安装 dstat,使用 报错「建议收藏」报错hairui@hadoop:~$dstatFile"/usr/bin/dstat",line119exceptgetopt.error,exc:^SyntaxError:invalidsyntaxhairui@hadoop:~$dstat程序“dstat”尚未安装。您可以使用以下命令安装:sudo…

  • datagrip 激活码【注册码】

    datagrip 激活码【注册码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号