POJ 1018 Communication System 贪心+枚举
看题传送门:http://poj.org/problem?id=1018
题目大意:
某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:带宽bandwidths 和 价格prices。
现在每种设备都各需要1个,考虑到性价比问题,要求所挑选出来的n件设备,要使得B/P最大。
其中B为这n件设备的带宽的最小值,P为这n件设备的总价。
思路:
贪心+枚举
要使得B/P最大,则B应该尽量大,而P尽量小。
可以按照价格从小到大排序。对于每一件产品,枚举出所有符合其他的bandwiths > 这一件的带宽。
因为把价格进行排序,价格小的在前面,所以可以肯定的是对于每件产品的第一次枚举,就是该次枚举的最优解。
比较每一次的最优解即可。
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct produce
{
int b;
int p;
bool operator<(const produce &pro)const
{
//如果价格一样就把b大的放前面
if(p==pro.p)
return b>pro.b;
return p<pro.p;
}
}; struct prodece_info
{
produce data[101];
int len;
}ps[101]; int n; double max(double a,double b)
{
return a<b? b:a;
} int main()
{
int t;
scanf("%d",&t); while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&ps[i].len);
for(int j=0;j<ps[i].len;j++)
scanf("%d%d",&ps[i].data[j].b,&ps[i].data[j].p);
//按照价格排序
sort(ps[i].data,ps[i].data+ps[i].len);
} //遍历开始
double ans=-99999;
double total_price, bandwidth; for(int i=0;i<n;i++)
{
for(int j=0;j<ps[i].len;j++)
{
//取其中一个b作为最小的
//之后应该选bandwidth不小于的且price尽量低的
bandwidth=ps[i].data[j].b;
total_price=ps[i].data[j].p;
bool ok=true;
for(int k=0;k<n;k++)
{
if(k==i)
continue;
else
{
int x=0;
//注意x合法性判断。都不满足的话。。。。。一开始没注意WA一次
while(bandwidth > ps[k].data[x].b && x<ps[k].len )
{
x++;
}
if(x==ps[k].len)
{
ok=false;
break;
}
total_price+=ps[k].data[x].p;
}
} if(ok)
ans=max(ans,bandwidth/total_price);
}
}
printf("%.3lf\n",ans);
}
}
POJ 1018 Communication System 贪心+枚举的更多相关文章
- poj 1018 Communication System 枚举 VS 贪心
Communication System Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21631 Accepted: ...
- POJ 1018 Communication System(贪心)
Description We have received an order from Pizoor Communications Inc. for a special communication sy ...
- poj 1018 Communication System (枚举)
Communication System Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22380 Accepted: ...
- POJ 1018 Communication System(树形DP)
Description We have received an order from Pizoor Communications Inc. for a special communication sy ...
- poj 1018 Communication System
点击打开链接 Communication System Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21007 Acc ...
- POJ 1018 Communication System (动态规划)
We have received an order from Pizoor Communications Inc. for a special communication system. The sy ...
- POJ 1018 Communication System(DP)
http://poj.org/problem?id=1018 题意: 某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1.m2.m3.....mn个厂家提供生产,而每个厂家生产 ...
- poj 1018 Communication System_贪心
题意:给你n个厂,每个厂有m个产品,产品有B(带宽),P(价格),现在要你求最大的 B/P 明显是枚举,当P大于一定值,B/P为零,可以用这个剪枝 #include <iostream> ...
- POJ 1018 Communication System 题解
本题一看似乎是递归回溯剪枝的方法.我一提交,结果超时. 然后又好像是使用DP,还可能我剪枝不够. 想了非常久,无奈忍不住偷看了下提示.发现方法真多.有贪心,DP,有高级剪枝的.还有三分法的.八仙过海各 ...
随机推荐
- 用SSL保Samba安全
用SSL保Samba安全 在企业中用Samba做为文件服务器是非常容易的事了,那如何保证存储数据的安全,如何保证数据传输的安全呢?我以前介绍过通过Samba安全级别和加装防病毒软件在 ...
- 修改url中某个参数
function changeURLArg(url,arg,arg_val){ var pattern=arg+'=([^&]*)'; var replaceText=arg+'='+arg_ ...
- Vue给元素添加样式
Vue中使用样式 绑定css 数组 <style> .red{ color:red } .thin{ font-size:18px } </style> <h1 :cla ...
- 使用dockerfile构建镜像(docker build)
Docker buidl . 找出当前文件夹下的Docker build文件名的文件 Docker build -t centos(镜像名) . 在当前目录下找centos的镜像文件 Docker ...
- yum---rpm软件包管理器
yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性 ...
- Linux下关机命令的区别 (halt,poweroff,reboot,shutdown,init)
1.shutdown shutdown命令安全地将系统关机. 而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭.并且login指令会被冻结﹐即新的用户不能再登录 ...
- JNDI学习总结(1)——JNDI入门
JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有 ...
- Oracle 10g 10.2.0.1 在Oracle Linux 5.4 32Bit RAC安装手冊(一抹曦阳)
Oracle 10g 10.2.0.1 在Oracle Linux 5.4 32Bit RAC安装手冊(一抹曦阳).pdf下载地址 ,step by step http://download.csdn ...
- js---BOM 的理解方法
windows 方法 window.close(); //关闭窗口 window.alert("message"); //弹出一个具有OK按钮的系统消息框,显示指定的文本 ...
- IPod在Linux下的实战
刚收到一个朋友送的Ipod,经过研究今天我为大家分享一点在Linux系统下使用的经验.Apple的iPod它炫目时尚,超薄还可以俘储大量歌曲,这使得iPod十分流行.但流行的同时也带来了一些问题, 在 ...