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> ...
随机推荐
- js 中的cookie
根据智能社31cookie基础与应用总结, cookie的特性: 1.同一个网站,共用一套cookie,实际上是根据域名来区分的. 如t.sina.com.cn ,和weibo.com这两个都是新浪微 ...
- UVALive 6467 Strahler Order 拓扑排序
这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ ...
- Week5(10月10日):国庆之后,让我们整装期待元旦吧
Part I:提问 =========================== 1.要将“Hello, Admin",从控制器传递到视图,该如何操作? (1)使用ViewData (2)使用V ...
- PHP urlencode()和rawurlencode()使用和区别
string urlencode ( string $str ) 此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页. 返回值 返回字符串,此字符串中除了 -_. 之 ...
- vc++窗口的创建过程(MFC消息机制的经典文章)
一.什么是窗口类 在Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗口的各种消息交给谁处理呢?所以VC ...
- zzuli求最大值
1786: 求最大值 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 134 Solved: 28SubmitStatusWeb Board Desc ...
- quartz群调查调度机制和源代码分析
pageId=85056282#quartz集群调度机制调研及源代码分析-quartz2.2.1集群调度机制调研及源代码分析" style="color:rgb(59,115,17 ...
- android学习--视图列表(ListView和ListActivity)
说明: 视图列表(ListView和ListActivity)与AutoComplete.Spinner类似,它们都须要一个供显示的列表项,能够须要借助于内容Adapter提供显示列表项 创建List ...
- QTableWidget 导出到csv表格
跳槽到了新的公司,开始苦逼的出差现场开发,接触到了新的应用.有很多应用需要将Table导出成表格,可以把table导出成csv格式的文件.跟大伙分享一下: lass TableToExcle : pu ...
- C语言的system函数
这个是与操作系统有关的函数,在linux/unix下system可以运行所有的shell命令windows下system可运行所有的windows执行文件,除DOS命令外,也可运行windwos ...