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 ...
随机推荐
- winform窗体全屏
bool fullscreen = false;Rectangle rect = new Rectangle();private void button4_Click(object sender, E ...
- 关于Get和Post
get和post 简介: Get和post是表单提交数据的两种基本方式,get请求数据通过域名后缀url传送,用户可见,不安全,post请求数据通过在请求报文正文里传输,相对比较安全. get是通过u ...
- springMVC框架搭建
springMVC和struts一样为MVC框架,但是springMVC与spring做到无缝连接. 在搭建SpringMVC时可以在官网上下载最新的jar包. http://www.springso ...
- STL algorithm算法is_permutation(27)
is_permutation原型: std::is_permutation equality (1) template <class ForwardIterator1, class Forwar ...
- Effective C++_笔记_条款08_别让异常逃离析构函数
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) C++并不禁止析构函数吐出异常,但它不鼓励你这样做.考虑如下代码 ...
- 发掘ListBox的潜力(三):显示即时提示(Tips)
ListBox显示即时提示(Tips) Listbox内容太长时超出Listbox宽度的部分将无法显示,一种解决方法是让Listbox产生横向滚动条,滚动显示内容(见前面的<发掘ListBox的 ...
- 14.9.2 Specifying the Row Format for a Table 指定 表的行格式
14.9.2 Specifying the Row Format for a Table 指定 表的行格式 mysql> SHOW TABLE STATUS\G; *************** ...
- 动态修改PE文件图标(使用UpdateResource API函数)
PE文件的图标存储在资源文件中,而操作资源要用到的API函数就是UpdateResource首先我们需要先了解一下ICO格式,参考资料:http://www.moon-soft.com/program ...
- one command 一键收集 oracle 巡检信息(包括dbhc,awr reports)
初步效果图例如以下 SQL> @nb ------Oracle Database health Check STRAT ------Starting Collect Data Informati ...
- MySQL 更新走全表和索引的评估记录数
#!/usr/bin/perl use DBI; $db_name='scan'; $ip='127.0.0.1'; $user="root"; $passwd="123 ...