POJ 1018 【枚举+剪枝】.cpp
题意:
给出n个工厂的产品参数带宽b和价格p,在这n个工厂里分别选1件产品共n件,使B/P最小,其中B表示n件产品中最小的b值,P表示n件产品p值的和。
输入 iCase n
表示iCase个样例n个工厂
m1 p1 b1 p2 b2..pm1 bm1 //第一个工厂有m1个同种类不同参数的产品,每一个产品的参数分别是p1 b1 p2 b2
m2 p1 b1 p2 b2..pm2 bm2
...
mn p1 b1 p2 b2..pmn bmn
思路:
排序,先把b从小到大排序,然后把p从小到大排序,最后让第几个工厂的序号从小到大排序
排完后就可以直接枚举了,枚举bi,固定了bi之后就枚举pj,取每一个工厂里满足bj比bi大的就加起来,然后计算哪一个值最大..
Tip:
其中有一些优化就是剪枝:
①. 因为最后肯定要有n个bj比bi大,所以bi枚举到sum-(n-1)就可以了,sum表示总共有多少个产品..
②. 如果枚举到bi比某一个公司的所有产品的b都大的时候,就不用往后枚举了,因为产品是按b排过序的,题目要求n-1个公司里面选取的b都要比当前bi大,既然当前bi比某一个公司的所有b都大了,则该公司无法选取符合条件的产品,而后面产品b都比bi大,就跟不可能选取到符合条件的产品了,所以就可以直接break;
③. 如果枚举到某一个bi的时候,bj比bi大的公司个数不满n个的话bi后面的b也可以不枚举了,原因同上..
Code:
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std; const int MAXN = ; struct Div
{
int id;
int p;
int b;
}_div[MAXN*MAXN];
int maxB[MAXN]; int cmp(Div a, Div b)
{
if (a.b != b.b) return a.b < b.b;
else if (a.p != b.p) return a.p < b.p;
else return a.id < b.id;
} int main()
{
// freopen("in.txt", "r", stdin);
int iCase, n, m, sum;
//int vis;
bool vis[MAXN];
double ans;
bool flag;
scanf("%d", &iCase);
while (iCase--) {
sum = ans = ;
memset(maxB, , sizeof(maxB));
flag = true; scanf("%d", &n);
for (int i = ; i < n; ++i) {
scanf("%d", &m);
while (m--) {
scanf("%d %d", &_div[sum].b, &_div[sum].p);
maxB[i] = max(maxB[i], _div[sum].b);
_div[sum++].id = i;
}
} sort(_div, _div+sum, cmp); for (int i = ; i < sum-(n-); ++i) {
int P = _div[i].p;
int count = ;
// vis = (1<<n)-1;
// vis ^= (1<<_div[i].id);
memset(vis, false, sizeof(vis));
vis[_div[i].id] = true;
for (int j = i+; j < sum; ++j)
// if (vis & (1<<_div[j].id)) {
if (!vis[_div[j].id]) {
if (maxB[_div[j].id] < _div[i].b) {
flag = false;
break;
}
P += _div[j].p;
//vis ^= (1<<_div[j].id);
vis[_div[j].id] = true;
count++;
}
if (count < n || !flag) break;
ans = max(ans, (double)_div[i].b/P);
}
printf("%.3lf\n", ans);
}
return ;
}
链接:http://poj.org/problem?id=1018
POJ 1018 【枚举+剪枝】.cpp的更多相关文章
- poj 1018(枚举+贪心)
通讯系统 We have received an o ...
- POJ 1018 Communication System(树形DP)
Description We have received an order from Pizoor Communications Inc. for a special communication sy ...
- POJ 1018 Communication System 贪心+枚举
看题传送门:http://poj.org/problem?id=1018 题目大意: 某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m个厂家提供生产,而每个厂家生产的同种设备都 ...
- POJ 2531 Network Saboteur (枚举+剪枝)
题意:给你一个图,图中点之间会有边权,现在问题是把图分成两部分,使得两部分之间边权之和最大. 目前我所知道的有四种做法: 方法一:状态压缩 #include <iostream> #inc ...
- poj 1018 Communication System 枚举 VS 贪心
Communication System Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21631 Accepted: ...
- 【poj 3080】Blue Jeans(字符串--KMP+暴力枚举+剪枝)
题意:求n个串的字典序最小的最长公共子串. 解法:枚举第一个串的子串,与剩下的n-1个串KMP匹配,判断是否有这样的公共子串.从大长度开始枚举,找到了就break挺快的.而且KMP的作用就是匹配子串, ...
- POJ 1054 The Troublesome Frog(枚举+剪枝)
题目链接 题意 :给你r*c的一块稻田,每个点都种有水稻,青蛙们晚上会从水稻地里穿过并踩倒,确保青蛙的每次跳跃的长度相同,且路线是直线,给出n个青蛙的脚印点问存在大于等于3的最大青蛙走的连续的脚印个数 ...
- poj 1018 Communication System (枚举)
Communication System Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22380 Accepted: ...
- 【贪心】Communication System POJ 1018
题目链接:http://poj.org/problem?id=1018 题目大意:有n种通讯设备,每种有mi个制造商,bi.pi分别是带宽和价格.在每种设备中选一个制造商让最小带宽B与总价格P的比值B ...
随机推荐
- 菜鸟nginx源代码剖析数据结构篇(一)动态数组ngx_array_t
菜鸟nginx源代码剖析数据结构篇(一)动态数组ngx_array_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
- NetBeans 7.2 or 8.0 编辑文件时不显示文件路径。
NetBeans 7.2 or 8.0 编辑文件时不显示文件路径. 仅仅实用鼠标停在标签上一下,才干够看到.非常不方便. 怎样解: http://plugins.netbeans.org/plugin ...
- SRM 627 D1L2GraphInversionsDFS查找指定长度的所有路径 Binary indexed tree (BIT)
题目:http://community.topcoder.com/stat?c=problem_statement&pm=13275&rd=16008 由于图中边数不多,选择DFS遍历 ...
- 奇葩的UI引用LayoutInflater.from问题
今收到BUG一枚,一个页面的EditText的风格变为了系统默认(系统经过定制,风格和普通的不同) 经检查xml无任何不妥,最终问题出在LayoutInflater.from上. 如果LayoutIn ...
- 控件编写:增强 TMEMO (一)(增加对WM_HSCROLL消息的处理)
相信没有什么人对 MEMO 陌生了吧.尽管其组件的功能不错.但是,对它进行一些功能的改进,可以更好的使用. 有的时候,我们想要知道,当前的坐标是什么?甚至,想要在 滚动条滚动时触发一些事件. 但,TM ...
- cocos2d-x游戏开发系列教程-前言
cocos2d-x游戏开发前景: 最近企业对于Cocos2D-X开发人才的用人需求很大,而且所提供的薪资相当可观. 为满足广大向往游戏开发行业同学的需求,特推出适合新手的Cocos2D-X手游开发教程 ...
- 关于wind7重新安装系统后,连接mysql的问题
系统重装对于我们来说,可以说是家常便饭了.但重装系统之后 ,又要装很多的应用软件是会很烦的.特别是重装一些数据库软件,时间长不说,搞不好数据丢失了会让人抓狂. 今天我简单介绍一个不用重装mysql的方 ...
- 菜鸟从零学编程(七)——搭建一个完整的Java开发环境
作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课.环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,eclipse(或者myeclipse ...
- android.graphics包中的一些类的使用
游戏编程相关参考 Matrix学习系列: http://www.moandroid.com/?p=1781 Android画图学习总结系列: http://www.moandroid.com/?p=7 ...
- iOS 开发学习35 本地化
增新语言 打开Project-Info-Localizations 点击Localization下的+ 新增语言 定义多语言文件 新增String Files 在Supporting Files上.新 ...