HooLee
If you believe, you can!
C++博客
首页
新随笔
新文章
联系
管理
poj1018Communication System
题意:有n个devices,每个devices有mi条网线与别的devices相连,每条网线有带宽b和价格p两个属性。(第一个device到最后一个device之间的)通路的总带宽为通路上带宽最小的那条网线的带宽,通路的价格为通路上所有网线的价格之和。求所有通路中最大的那个minb/sump。
错误的解题思路:
回溯。用回溯是万万不行的,
数据量是100^100
。
正确的解题方式:
枚举所有的带宽b,即将所有出现的带宽指定为minb枚举一遍,对每个device,只需要选出device_b >= minb && device_p尽可能小。求出性价比最高的那个。
数据量100 * 100。
如果对某一个device,它的网线没有一条b >= minb,直接跳过本轮即可,因为这条通路的性价比不可能是最大的(任意选一个这个device的b代替minb即可得到一个更大的性价比)。
反思:自己对数字不是很敏感,看到处理数字的题,就
感觉很抽象
,无从下手。
代码
1
import
java.io.
*
;
2
import
java.util.
*
;
3
class
Main
4
{
5
private
static
int
n;
6
private
static
int
ms[]
=
new
int
[
110
];
7
private
static
Node allNodes[][]
=
new
Node[
110
][
110
];
8
private
static
TreeSet
<
Integer
>
bset
=
new
TreeSet
<
Integer
>
();
9
private
static
int
bmin;
10
private
static
int
psum;
11
private
static
double
max;
12
13
public
static
void
main(String[] args)
14
{
15
Scanner sc
=
new
Scanner(System.in);
16
17
int
t
=
sc.nextInt();
18
for
(
int
i
=
0
; i
<
t; i
++
)
19
{
20
n
=
sc.nextInt();
21
bset.clear();
22
for
(
int
j
=
0
; j
<
n; j
++
)
//
read
23
{
24
ms[j]
=
sc.nextInt();
25
for
(
int
k
=
0
; k
<
ms[j]; k
++
)
26
{
27
int
b
=
sc.nextInt();
28
int
p
=
sc.nextInt();
29
allNodes[j][k]
=
new
Node(b, p);
30
bset.add(b);
31
}
32
Arrays.sort(allNodes[j],
0
, ms[j]);
33
}
//
read
34
35
max
=
0.0
;
36
psum
=
0
;
37
getMaxBP();
38
39
System.out.printf(
"
%.3f\n
"
, max);
40
41
}
42
}
43
private
static
void
getMaxBP()
44
{
45
for1:
46
for
(
int
minb : bset)
47
{
48
psum
=
0
;
49
for
(
int
i
=
0
; i
<
n; i
++
)
//
each device
50
{
51
int
p
=
findFitNode(minb, i);
52
if
(p
!=
-
1
)
53
{
54
psum
+=
p;
55
}
56
else
57
continue
for1;
58
}
59
double
t
=
1.0
*
minb
/
psum;
60
if
(max
<
t)
61
max
=
t;
62
}
63
}
64
private
static
int
findFitNode(
int
minb,
int
ni)
65
{
66
for
(
int
i
=
0
; i
<
ms[ni]; i
++
)
67
{
68
if
(allNodes[ni][i].getB()
>=
minb)
69
return
allNodes[ni][i].getP();
70
}
71
return
-
1
;
72
}
73
}
74
class
Node
implements
Comparable
<
Node
>
75
{
76
private
int
b;
77
private
int
p;
78
public
Node(
int
b,
int
p)
79
{
80
this
.b
=
b;
81
this
.p
=
p;
82
}
83
public
int
getB()
84
{
85
return
b;
86
}
87
public
int
getP()
88
{
89
return
p;
90
}
91
public
int
compareTo(Node nd2)
92
{
93
int
t
=
this
.p
-
nd2.p;
94
if
(t
==
0
)
95
return
nd2.b
-
this
.b;
96
return
t;
97
}
98
}
posted on 2013-03-27 17:53
小鼠标
阅读(187)
评论(0)
编辑
收藏
引用
所属分类:
Java基础练习
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
编辑距离
闰年判断
正则表达式简单笔记
Excel格式地址转换
一道模拟题——机器人行走距离计算
排列练习2
素数筛法
排列组合练习
排列组合
poj1068Parencodings
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
<
2013年3月
>
日
一
二
三
四
五
六
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
常用链接
我的随笔
我的评论
我参与的随笔
随笔分类
(111)
C语言(3)
DP(9)
Java笔记(1)
Java基础练习(25)
安卓(1)
本科毕设(1)
博弈(1)
大数(7)
回溯(2)
排序(10)
暑期培训周赛(3)
数据结构(7)
数论(1)
水题(8)
图论(24)
网选训练(8)
随笔档案
(127)
2014年3月 (1)
2013年7月 (10)
2013年5月 (1)
2013年4月 (11)
2013年3月 (8)
2012年10月 (1)
2012年9月 (12)
2012年8月 (38)
2012年7月 (14)
2012年6月 (2)
2012年5月 (8)
2012年4月 (6)
2012年3月 (6)
2012年2月 (4)
2011年8月 (5)
friends
陈钢
大鹏
党姐
焦林枫
汪涛
小白学长
媛姐
媛姐csdn
最新评论
1. re: 线段树
是这个样子的,所以在OJ有时候“卡住”了也不要太灰心,没准真的不是自己的原因呢。
加油,祝你好运啦!
--小鼠标
2. re: 线段树
对于编程竞赛来说,Java所需时间一般为C/C++的两倍。合理的竞赛给Java的时间限制是给C/C++的两倍。
--伤心的笔
3. re: poj1273--网络流
过来看看你。
--achiberx
4. re: (转)ubuntu11.10无法启动无线网络的解决方法
膜拜大神。。查了一个下午资料终于在这里解决了问题。。神牛说的区域赛难道是ACM区域赛。。?
--Hang
5. re: 快速排序、线性时间选择
博主,谢谢你的文章。你的方法可以很好的处理分区基准在数组中重复的情况,书上的方法遇到这种输入会堆栈溢出。书上给出了解释但给的方法貌似不简洁。
--lsxqw2004
阅读排行榜
1. 单调队列(5480)
2. Linux select()函数使用(3954)
3. 快速排序、线性时间选择(3619)
4. poj3468--绝对经典的线段树题(3611)
5. 优先队列--堆实现(3291)