poj 1018 Communication System 枚举 VS 贪心
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 21631 | Accepted: 7689 |
Description
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
Output
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 贪心的更多相关文章
- poj 1018 Communication System (枚举)
Communication System Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22380 Accepted: ...
- POJ 1018 Communication System(贪心)
Description We have received an order from Pizoor Communications Inc. for a special communication sy ...
- 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 贪心+枚举
看题传送门:http://poj.org/problem?id=1018 题目大意: 某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m个厂家提供生产,而每个厂家生产的同种设备都 ...
- POJ 1018 Communication System(DP)
http://poj.org/problem?id=1018 题意: 某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1.m2.m3.....mn个厂家提供生产,而每个厂家生产 ...
- POJ 1018 Communication System 题解
本题一看似乎是递归回溯剪枝的方法.我一提交,结果超时. 然后又好像是使用DP,还可能我剪枝不够. 想了非常久,无奈忍不住偷看了下提示.发现方法真多.有贪心,DP,有高级剪枝的.还有三分法的.八仙过海各 ...
- poj 1018 Communication System_贪心
题意:给你n个厂,每个厂有m个产品,产品有B(带宽),P(价格),现在要你求最大的 B/P 明显是枚举,当P大于一定值,B/P为零,可以用这个剪枝 #include <iostream> ...
随机推荐
- [原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)
链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框 ...
- BZOJ 2101: [Usaco2010 Dec]Treasure Chest 藏宝箱( dp )
dp( l , r ) = sum( l , r ) - min( dp( l + 1 , r ) , dp( l , r - 1 ) ) 被卡空间....我们可以发现 l > r 是无意义的 ...
- Android 使用 array.xml
//获取文件资源 TypedArray mainNavIcon = context.getResources().obtainTypedArray(R.array.mainNavIcon); //获取 ...
- centos下yum安装crontab+mysql自动备份
参考博文: centos下yum安装crontab yum install vixie-cron crontabs //安装 chkconfig crond on ...
- 【 D3.js 入门系列 — 2.1 】 选择、插入、删除元素
1. select 和 selectAll 的区别 在 D3 中,选择元素的函数有两个:select 和 selectAll,它们的使用非常重要.先说明一下它们的区别: select 是选择所有指定元 ...
- Ant学习实例
ant 目录(?)[+] Ant学习实例 安装Ant 基础元素 project元素 target元素 property元素 完整示例 Ant学习实例 1.安装Ant 先从http://ant. ...
- java之Thread.sleep(long)与object.wait()/object.wait(long)的区别(转)
一.Thread.sleep(long)与object.wait()/object.wait(long)的区别sleep(long)与wait()/wait(long)行为上有些类似,主要区别如下:1 ...
- UNIX网络编程 卷2:进程间通信
这篇是计算机类的优质预售推荐>>>><UNIX网络编程 卷2:进程间通信(第2版)> UNIX和网络专家W. Richard Stevens的传世之作 编辑推荐 两 ...
- c++,operator=
operator=为什么值得注意? 从语法上讲,下面的程序可以编译通过,我在另一篇笔记示例里面也这样用了. class A1 { public: int operator=(int a)//参数是in ...
- C-KMP
一.BF算法 --传统算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的 ...