NOIP欢乐模拟赛 T3 解题报告
3.小澳的葫芦
(calabash.cpp/c/pas)
【题目描述】
小澳最喜欢的歌曲就是《葫芦娃》。
一日表演唱歌,他尽了洪荒之力,唱响心中圣歌。
随之,小澳进入了葫芦世界。
葫芦世界有n个葫芦,标号为1~ n。n个葫芦由m条藤连接,每条藤连接了两个葫芦,这些藤构成了一张有向无环图。小澳爬过每条藤都会消耗一定的能量。
小澳站在1号葫芦上(你可以认为葫芦非常大,可以承受小澳的体重),他想沿着藤爬到n号葫芦上,其中每个葫芦只经过一次。
小澳找到一条路径,使得消耗的能量与经过的葫芦数的比值最小。
【输入格式】
输入文件名为calabash.in。
输入文件第一行两个正整数n,m,分别表示葫芦的个数和藤数。
接下来m行,每行三个正整数u,v,w,描述一条藤,表示这条藤由u连向v,小澳爬过这条藤需要消耗w点能量。
【输出格式】
输出文件名为calabash.out。
一行一个实数,表示答案(误差不超过 10^-3)。
【输入输出样例】
calabash.in |
calabash.out |
4 6 1 2 1 2 4 6 1 3 2 3 4 4 2 3 3 1 4 8 |
2.000 |
【输入输出样例说明】
有4种爬法:
1->4,消耗能量8,经过2个葫芦,比值为8/2=4。
1->2->4,消耗能量1+6=7,经过3个葫芦,比值为7/3≈2.33。
1->3->4,消耗能量2+4=6,经过3个葫芦,比值为6/3=2。
1->2->3->4,消耗能量1+3+4=8,经过4个葫芦,比值为8/4=2。
所以选第三种或第四种方案,答案为2。
【数据规模与约定】
测试点编号 |
n |
m |
特殊说明 |
1 |
2 |
1 |
|
2 |
100 |
99 |
除1外,所有葫芦的入度均为1 |
3 |
100 |
105 |
所有从1到n的路径经过的葫芦数相等 |
4 |
100 |
1000 |
|
5 |
100 |
1000 |
|
6 |
199 |
198 |
除1外,所有葫芦的入度均为1 |
7 |
200 |
231 |
所有从1到n的路径经过的葫芦数相等 |
8 |
200 |
2000 |
|
9 |
200 |
2000 |
|
10 |
200 |
2000 |
对于所有数据,小澳爬过每条藤消耗的能量不会超过10^3,且一定存在一条从1到n的路径。
—————————————————分割线———————————————
分析:
【algorithm1】 第一个测试点只有一条边,输出 w/2 就可以啦。 可以通过第 1 个测试点。
【algorithm2】 注意到“除 1 外,所有葫芦的入度均为 1”,也就是说,从 1 到 n 的路径只有 一条,输出这一条路径的长度与这条路径上的点数的比值就可以了。 可以通过第 1、2、6 个测试点。
【algorithm3】 对于这样一类特殊数据,“所有从 1 到 n 的路径经过的葫芦数相等”,也就 是说 1~n 的最短路就是最优路径,最短路的长度与路径上的点数的比值就是答 案。 可以通过第 1、2、3、6、7 个测试点。
【algorithm4】 另建一个起点 0,连接一条 0 到 1 长度为 0 的边,就此将问题转化为长度和 边数最小比值。这个问题的求解需要分数规划。 假设答案为 ans,对于任意一条由 k 条边组成的路径,有: ( w1 + w2 + w3 + …+wk ) / k >= ans ;
转化一下: ( w1 + w2 + w3 + … + wk ) >= ans * k ; 即 ( w1 - ans ) + ( w2 - ans ) + ( w3 - ans ) + … + ( wk - ans ) >= 0 。 于是就得到了这样一个算法: 二分答案 x,每次将每一条边的权值减去 x 求最短路,判断 1~n 的最短路是 否大于 0:若大于 0,则说明答案 ans>x;否则说明 ans<x。 这样可以通过所有测试点。
#include "cstdio"
#include "iostream"
#include "vector"
#include "queue"
#include "cstring" using namespace std ;
struct Edge { int to , next ;double val ,org; } ;//org原始的边权
const int maxN = ;
const double INF = 1e20 ;
const double eps = 1e- ;//误差范围 Edge e[ maxN << ] ;
double Dis[ maxN ] ;
bool vis[ maxN ] ;
int head[ maxN ] ; int cnt , N , M ; queue<int> q; int INPUT ( ) {
int x = , f = ; char ch = getchar ( ) ;
while ( ch < '' || ch > '' ) { if ( ch == '-')f = - ;ch = getchar ( ) ;}
while ( ch >='' && ch <='' ) { x = ( x << ) + ( x << ) + ch - '' ; ch = getchar ( ) ;}
return x * f ;
} void Add_Edge ( const int x , const int y , const double val ) {
e[ ++cnt ].to = y ;
e[ cnt ].org = val ;
e[ cnt ].next = head[ x ] ;
head[ x ] = cnt ;
} bool SPFA ( const double x ) {//纯SPFA算法
memset ( vis , false , sizeof ( vis ) ) ;
queue < int > Q ;
for ( int i= ; i<=N ; ++i )
Dis[ i ] = INF ;
for ( int i= ; i<=cnt ; ++i ) e[ i ].val = e[ i ].org - x ;
Q.push( ) ;
vis[ ] = true ;
Dis[ ] = ;
while ( !Q.empty( ) ) {
int t = Q.front ( ) ; Q.pop ( ) ; vis[ t ] = false ;
for ( int i=head[ t ] ; i ; i = e[ i ].next ) {
int temp = e[ i ].to ;
if ( Dis[ temp ] - eps > Dis[ t ] + e[ i ].val ) {
Dis[ temp ] = Dis[ t ] + e[ i ].val ;
if ( !vis[ temp ] ) {
Q.push( temp ) ;
vis[ temp ] = true ;
}
}
}
} return Dis[ N ] < -eps ;
} int main ( ) {
N = INPUT ( ), M = INPUT ( ) ;
for ( int i= ; i<=M ; ++i ) {
int _x = INPUT ( ) , _y = INPUT( ) , _val = INPUT ( ) ;
Add_Edge ( _x , _y , _val ) ;
}
Add_Edge ( , , ) ;//加入0虚拟节点
double l = , r = 1e3 ;
while ( r - l >= eps ) {//二分答案
double mid = ( l + r ) / 2.0 ;//2.0防止精度误差
if ( SPFA ( mid ) ) r = mid ;
else l = mid ;
}
printf ( "%.3lf" , l ) ;
return ;
}
calabash
NOIP_RP++;
2016-10-08 21:20:05
(完)
NOIP欢乐模拟赛 T3 解题报告的更多相关文章
- NOIP欢乐模拟赛 T2 解题报告
小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...
- NOIP欢乐模拟赛 T1 解题报告
小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑 ...
- 20161005 NOIP 模拟赛 T3 解题报告
subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...
- 【HHHOJ】NOIP模拟赛 玖 解题报告
点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...
- 【HHHOJ】NOIP模拟赛 捌 解题报告
点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...
- 20161005 NOIP 模拟赛 T2 解题报告
beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...
- 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱
题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...
- 冲刺Noip2017模拟赛1 解题报告——五十岚芒果酱
题1 国际象棋(chess) [问题描述] 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加2场对弈,最少参加0场对弈.每个人都有一个与其他人都不相同的等级(用一个正整数来表示).在对 ...
- 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱
1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...
随机推荐
- java中常用的工具类(三)
继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类 ...
- 浅析配置更快的Eclipse方法
很多人感觉自己的elipse启动比较慢,其实并不是因为装的插件太多或者是导入的项目有点大,而是因为参数的设置不合理导致的.可以在eclipse.ini里面添加-Xloggc:gc.log看看启动的日志 ...
- AspectFill VS. AspectFit
从去年10月进入公司,到现在差不多忙碌了3个月,期间几乎所有精力和时间都花在了公司的项目上,有很多工作学习的心得一直没有总结,趁周末无事就来使这写一写. 除了刚进公司的那一个月是做一些修修补补的工作, ...
- Grafana 安装
由于 Grafana 是存静态的,你只需要下载源代码解压,将它部署在 Nginx 上面就可以了,或者可以用 Python 的 SimpleHTTPServer 来跑 $ wget http://gra ...
- phpcms v9 wap内容页内容显示方法
phpcms v9的wap手机门户的问题解决 默认的{$content}标签假如内容页一开始输入的不是html代码的话会出现调用不出来的情况,这里用{$rs['content']} 来调用则可以解决问 ...
- 免费电子书:C#代码整洁之道
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:<Clean Code(代码整洁之道)>是一本经典的著作,那么对于编写整洁 ...
- C语言中的static 详细分析
转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...
- webrtc中的带宽自适应算法
转自:http://www.xuebuyuan.com/1248366.html webrtc中的带宽自适应算法分为两种: 1, 发端带宽控制, 原理是由rtcp中的丢包统计来动态的增加或减少带宽,在 ...
- EditPlus+VisualStudio配置VC简易开发环境环境
对于C++开发, 我想在Windows下大家用的最多的应该是MS的VC++.但其强大的功能背后却有着"启动速度慢","占用资源多"的缺点,尤其是VS后 ...
- view的setTag() 和 getTag()应用 (转)
原文地址:http://www.cnblogs.com/qingblog/archive/2012/07/03/2575140.html View中的setTag(Onbect)表示给View添加一个 ...