Communication System
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 21631   Accepted: 7689

Description

We have received an order from Pizoor Communications Inc. for a special communication system. The system consists of several devices. For each device, we are free to choose from several manufacturers. Same devices from two manufacturers differ in their maximum bandwidths and prices. 
By overall bandwidth (B) we mean the minimum of the bandwidths of the chosen devices in the communication system and the total price (P) is the sum of the prices of all chosen devices. Our goal is to choose a manufacturer for each device to maximize B/P. 

Input

The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by the input data for each test case. Each test case starts with a line containing a single integer n (1 ≤ n ≤ 100), the number of devices in the communication system, followed by n lines in the following format: the i-th line (1 ≤ i ≤ n) starts with mi (1 ≤ mi ≤ 100), the number of manufacturers for the i-th device, followed by mi pairs of positive integers in the same line, each indicating the bandwidth and the price of the device respectively, corresponding to a manufacturer.

Output

Your program should produce a single line for each test case containing a single number which is the maximum possible B/P for the test case. Round the numbers in the output to 3 digits after decimal point. 

Sample Input

1 3
3 100 25 150 35 80 25
2 120 80 155 40
2 100 100 120 110

Sample Output

0.649

做这题的时候,一开始的想法就是暴力枚举,虽然这样可能会超时,但是觉得可以做强有力的剪枝,于是就试了下,可是没有做论证推断,不知道应该怎样去做剪枝,其实主要是嫌麻烦,下面是我简单的枚举代码,不过超时了。

#include <stdio.h>
#include <stdlib.h>
#define MAX 100 struct Dev{
int b;
int p; }dev[MAX][MAX]; int n;
float result = -1; void Init()
{
int i, j;
for(i=0; i < MAX; i++)
{
for(j=0; j < MAX; j++)
{
dev[i][j].b= -1;
dev[i][j].p = -1;
}
}
} void PrintData(int *data, int *sum)
{
int min=data[0], temp=sum[0], i;
float tempRes;
for(i=1; i < n; i++)
{
if(data[i] < min) min = data[i];
temp += sum[i];
}
tempRes = min*1.0/ temp;
if(tempRes > result)
result = tempRes;
} void SolveCase(int *data,int *sum, int depth)
{
int i;
for(i=0; i<MAX && dev[depth][i].b != -1; i++)
{
data[depth] = dev[depth][i].b;
sum[depth] = dev[depth][i].p;
if(depth==n-1)
PrintData(data, sum);
else
SolveCase(data,sum, depth+1);
}
} int main()
{
// freopen("input.txt","r",stdin);
int caseNum, number;
int *testData, *sum , i, j; scanf("%d",&caseNum);
while(caseNum > 0)
{
Init();
scanf("%d", &n);
for(i=0; i < n; i++)
{
scanf("%d",&number);
for(j=0; j < number; j++)
scanf("%d %d", &dev[i][j].b, &dev[i][j].p);
}
testData = (int *)malloc(sizeof(int)*n);
sum = (int *)malloc(sizeof(int)*n);
SolveCase(testData,sum,0);
printf("%.3f\n",result);
result = -1;
caseNum--;
}
free(testData);
free(sum);
// fclose(stdin);
return 0;
}


超时之后,感觉可以用贪心做,然后贪心的话每次使得b 值增大,使得 p 值减少,这样才能使得结果是最大了,思路很简单,以为还是不行,结果AC 了.....

#include<cstdio>
#include<cstring>
int main()
{
// freopen("input.txt","r",stdin);
int t,n,m,b[105][105],fac[105],p[105][105],flag[32767],max,min,tp;
scanf("%d",&t);
while(t--){
max=0,min=9999999;
scanf("%d",&n);
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++){
scanf("%d",&fac[i]);
for(int j=0;j<fac[i];j++){
scanf("%d%d",&b[i][j],&p[i][j]);
flag[b[i][j]]=1;
if(max<b[i][j])
max=b[i][j];
if(min>b[i][j])
min=b[i][j];
}
}
double result=0;
for(int i=min;i<=max;i++){
if(flag[i]){
int sum=0;
for(int j=0;j<n;j++){
tp=99999999;
for(int k=0;k<fac[j];k++){
if(b[j][k]>=i&&p[j][k]<tp){
tp=p[j][k];
}
}
sum+=tp;
}
double temp=(double)i/sum;
if(result<temp)
result=temp;
}
}
printf("%.3f\n",result);
}
// fclose(stdin);
return 0;
}
												

poj 1018 Communication System 枚举 VS 贪心的更多相关文章

  1. poj 1018 Communication System (枚举)

    Communication System Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22380   Accepted:  ...

  2. POJ 1018 Communication System(贪心)

    Description We have received an order from Pizoor Communications Inc. for a special communication sy ...

  3. POJ 1018 Communication System(树形DP)

    Description We have received an order from Pizoor Communications Inc. for a special communication sy ...

  4. poj 1018 Communication System

    点击打开链接 Communication System Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21007   Acc ...

  5. POJ 1018 Communication System (动态规划)

    We have received an order from Pizoor Communications Inc. for a special communication system. The sy ...

  6. POJ 1018 Communication System 贪心+枚举

    看题传送门:http://poj.org/problem?id=1018 题目大意: 某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m个厂家提供生产,而每个厂家生产的同种设备都 ...

  7. POJ 1018 Communication System(DP)

    http://poj.org/problem?id=1018 题意: 某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1.m2.m3.....mn个厂家提供生产,而每个厂家生产 ...

  8. POJ 1018 Communication System 题解

    本题一看似乎是递归回溯剪枝的方法.我一提交,结果超时. 然后又好像是使用DP,还可能我剪枝不够. 想了非常久,无奈忍不住偷看了下提示.发现方法真多.有贪心,DP,有高级剪枝的.还有三分法的.八仙过海各 ...

  9. poj 1018 Communication System_贪心

    题意:给你n个厂,每个厂有m个产品,产品有B(带宽),P(价格),现在要你求最大的 B/P 明显是枚举,当P大于一定值,B/P为零,可以用这个剪枝 #include <iostream> ...

随机推荐

  1. BZOJ 2809: [Apio2012]dispatching( 平衡树 + 启发式合并 )

    枚举树上的每个结点做管理者, 贪心地取其子树中薪水较低的, 算出这个结点为管理者的满意度, 更新答案. 用平衡树+启发式合并, 时间复杂度为O(N log²N) ------------------- ...

  2. vhost文件设置

    #例子<VirtualHost *.82> #设置端口号为82 ServerName localhost #服务器名称 DocumentRoot "d:/Web" #文 ...

  3. int *p = NULL 和 *p = NULL(转载)

    int *p = NULL 和 *p = NULL int *p = NULL;      这时候我们用编译器查看p的值为0x00000000.这句话的意思是定义一个指针变量p,其指向内存里面保存的是 ...

  4. tabbar动画切换

    效果1: UIViewController *vc = self.viewControllers[self.selectedIndex]; CATransition *animation =[CATr ...

  5. Flask web应用

    Flask web应用 一.介绍 最近开发要用一个测试环境,是这样的Nginx+uwsgi+flask 的一个结构.下面是一些记录,在Centos 系统上使用Flask 架构部署一个简单的Python ...

  6. 2、Zookeeper集群搭建、命令行Client操作

    zookeeper 集群最好是奇数台: 5台允许挂掉2台 4台只能允许挂掉1台 zjtest7-redis:/opt/zookeeper/bin# ./zkServer.sh status ZooKe ...

  7. MIT 三课程

    mit三课程: Introduction to Computer Science and Programming artificial intelligence introduction to alg ...

  8. 严重: Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: getOutputStream() has already been called

    错误: 严重: Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: getOutput ...

  9. 清华集训2014 day2 task1 简单回路

    题目 如题. 算法 就是刚学习的插头DP. 从前往后和从后往前分别进行一次DP. 要点 合法的括号序列只有103个 如何合并两次dp的信息 一开始犯傻了,以为当且仅当两个轮廓线的状态相同才是合法的方案 ...

  10. Activity跳转时传递Bitmap对象的实现

    前言 相信大家可能都了解Activity跳转时我们是能够传递參数的,比方使用Intent传递或者Bundle来传递,把当前Activity的一些信息传递给将要跳转到的新的Activity.可是不知道大 ...