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,有高级剪枝的.还有三分法的.八仙过海各 ...
随机推荐
- CHROME开发者工具的小技巧
我猜不能转载,但是必须分享. http://coolshell.cn/articles/17634.html
- 51.cgi网站后门
运行截图: html开发: <html> <body> <form id="form" name="form" method=&q ...
- 洛谷P1722 矩阵 II
题目背景 usqwedf 改编系列题. 题目描述 如果你在百忙之中抽空看题,请自动跳到第六行. 众所周知,在中国古代算筹中,红为正,黑为负…… 给定一个1*(2n)的矩阵(usqwedf:这不是一个2 ...
- 为root账户更名
为root账户更名 处于安全考虑许多管理员想把root更名,具体方法如下: 1.先以root登陆系统 2.用vi 编辑/etc/passwd文件,将第一行的第一个root修改为你想要的账户名,然后保存 ...
- 【习题 8-3 UVA - 12545】Bits Equalizer
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果1的个数第一个串比第2个串多. 那么就无解. 否则. 找几个位置去凑1 优先找'?'然后才是0的位置 剩余的全都用swap操作就 ...
- CSUOJ 1554 SG Value
1554: SG Value Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 140 Solved: 35 Description The SG val ...
- HDU 3400 Line belt (三分再三分)
HDU 3400 Line belt (三分再三分) ACM 题目地址: pid=3400" target="_blank" style="color:rgb ...
- 50行python代码实现个代理server(你懂的)
之前遇到一个场景是这种: 我在自己的电脑上须要用mongodb图形client,可是mongodb的server地址没有对外网开放,仅仅能通过先登录主机A,然后再从A连接mongodbserverB. ...
- leetcode -day29 Binary Tree Inorder Traversal & Restore IP Addresses
1. Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' ...
- python实现获取文件列表中每一个文件keyword
功能描写叙述: 获取某个路径下的全部文件,提取出每一个文件里出现频率最高的前300个字.保存在数据库其中. 前提.你须要配置好nltk #!/usr/bin/python #coding=utf-8 ...