英文原题 中文题译
大意:公司之间相互持有股份,如果A有B的51%以上的股份,则控股B,如果A控股B1,....Bk,这些公司和A本身对公司C的股份之和在51%以上,则A也控股C。给定公司间的股份持有率,要求计算公司之间的控股关系。
控股关系看上去很像偏序关系,不过不是。但其类似的传递性吸引人往Watshell算法上去考虑。于是有了第一个版本的程序。注意到一次watshell是不足以计算出控股关系的,需要多次计算。
此题中的陷阱:通常我们会在计算传递关系时将股份直接相加,但在极端情况下,100个公司的数据就足以使得32位整数溢出。这看起来觉得很荒唐,但的确发生了。一个环形控股实例(官方测试数据9)上就能发现。但这个错相当隐蔽,我看到NOCOW上似乎没人提到这一点,把能否通过归结成所谓RP。看下面第一实现的35行,第二个实现的40行,就是用来控制溢出的。如果没有这个,就需要在迭代或者循环中保存局部数据,做批次处理。(事实上我的第一个通过的版本就是这样做的,在不清楚溢出导致问题的情况下,保守的采取同步扩展的策略)。
上述版本的扩展队列实现,其基本过程完全一致,但体现从不同角度来考虑这个问题。写前面的代码基本上是从Watshell开始考虑的,写这个代码的基本上是直接考虑暴力求解的。注意到一个典型差别,在前者中有一个expanded数组来控制重复访问,而在后者中似乎没有。事实上后者用从不大于50到超过50的控股率来做标志,每个公司对只会产生一次这样的转换,因而不需要额外的判断重复的代码。
但一开始(没有40行对数据溢出的控制)还是出问题,在测试数据9下程序越界崩溃,百思不得其解,最终想到这个越界问题。看起来似乎100次加100肯定不越界,但事实上,如第一次有n个是200, 第二次产生400,....越界几乎是必然的!
这两个算法的对比满有意思,我们可以从第二个算法中提取出一个计算传递闭包的新算法来。另文描述。
大意:公司之间相互持有股份,如果A有B的51%以上的股份,则控股B,如果A控股B1,....Bk,这些公司和A本身对公司C的股份之和在51%以上,则A也控股C。给定公司间的股份持有率,要求计算公司之间的控股关系。
控股关系看上去很像偏序关系,不过不是。但其类似的传递性吸引人往Watshell算法上去考虑。于是有了第一个版本的程序。注意到一次watshell是不足以计算出控股关系的,需要多次计算。
此题中的陷阱:通常我们会在计算传递关系时将股份直接相加,但在极端情况下,100个公司的数据就足以使得32位整数溢出。这看起来觉得很荒唐,但的确发生了。一个环形控股实例(官方测试数据9)上就能发现。但这个错相当隐蔽,我看到NOCOW上似乎没人提到这一点,把能否通过归结成所谓RP。看下面第一实现的35行,第二个实现的40行,就是用来控制溢出的。如果没有这个,就需要在迭代或者循环中保存局部数据,做批次处理。(事实上我的第一个通过的版本就是这样做的,在不清楚溢出导致问题的情况下,保守的采取同步扩展的策略)。
/* ID: blackco3 TASK: concom LANG: C++ */ #include <iostream> #include <memory.h> using namespace std; #define _max_ 100 #define max(x,y) ((x)>(y)?(x):(y)) int main() { freopen("concom.in", "r", stdin); freopen("concom.out", "w", stdout); int n_triple, n_comp=0, rate[_max_][_max_]; cin >> n_triple ; memset( rate, 0, sizeof(rate) ); for( int i=0; i<n_triple; i++ ){ int a, b ; cin >> a >> b ; cin >> rate[a-1][b-1] ; n_comp= max(n_comp, max(a,b)); } int expanded[_max_][_max_], expanding ; memset( expanded, 0, sizeof(expanded) ); do { expanding=0 ; for( int i=0; i<n_comp; i++ ){ for( int k=0; k<n_comp; k++ ){ if( rate[i][k]<=50 || expanded[i][k] ) continue ; expanded[i][k]=1 , expanding=1; for( int j=0; j<n_comp; j++ ) rate[i][j] = min(rate[k][j]+rate[i][j], 100) ; } } }while(expanding); for( int i=0; i<n_comp; i++ ) for( int j=0; j<n_comp; j++ ){ if( i==j || rate[i][j]<50 ) continue ; cout << i+1 << " " << j+1 << endl ; } return 0; }
上述版本的扩展队列实现,其基本过程完全一致,但体现从不同角度来考虑这个问题。写前面的代码基本上是从Watshell开始考虑的,写这个代码的基本上是直接考虑暴力求解的。注意到一个典型差别,在前者中有一个expanded数组来控制重复访问,而在后者中似乎没有。事实上后者用从不大于50到超过50的控股率来做标志,每个公司对只会产生一次这样的转换,因而不需要额外的判断重复的代码。
但一开始(没有40行对数据溢出的控制)还是出问题,在测试数据9下程序越界崩溃,百思不得其解,最终想到这个越界问题。看起来似乎100次加100肯定不越界,但事实上,如第一次有n个是200, 第二次产生400,....越界几乎是必然的!
这两个算法的对比满有意思,我们可以从第二个算法中提取出一个计算传递闭包的新算法来。另文描述。
/* ID: blackco3 TASK: concom LANG: C++ */ #include <iostream> #include <stdlib.h> #include <memory.h> using namespace std; #define _max_ 110 #define max(x,y) ((x)>(y)?(x):(y)) struct t_ctrl { int parent, son ; } ctrl_list[_max_*_max_], *p_tail=ctrl_list; int ctrl_comp( const void *c1, const void *c2 ) { return ((t_ctrl*)c1)->parent==((t_ctrl*)c2)->parent ? ((t_ctrl*)c1)->son-((t_ctrl*)c2)->son : ((t_ctrl*)c1)->parent-((t_ctrl*)c2)->parent ; } int main() { freopen("concom.in", "r", stdin); freopen("concom.out", "w", stdout); int n_triple, n_comp=0, rate[_max_][_max_] ; cin >> n_triple ; memset( rate, 0, sizeof(rate) ); for( int i=0; i<n_triple; i++ ){ int a, b ; cin >> a >> b ; n_comp= max(n_comp, max(a,b)); cin >> rate[--a][--b] ; if( rate[a][b] > 50 ) p_tail->parent=a , p_tail->son=b, p_tail++ ; } int counter=0, next; for( t_ctrl *pc=ctrl_list; pc!=p_tail; pc++ ){ for( int j=0; j<n_comp; j++ ) { next = rate[pc->parent][j] + rate[pc->son][j] ; if( rate[pc->parent][j]<=50 && next>50 ) p_tail->parent=pc->parent , p_tail->son=j, p_tail++ , counter++; rate[pc->parent][j] = next>100? 100 : next ; } } qsort( ctrl_list, p_tail-ctrl_list, sizeof(t_ctrl), ctrl_comp ); for( t_ctrl *pc=ctrl_list; pc!=p_tail; pc++ ) if( pc->parent != pc->son ) cout << pc->parent+1 << " " << pc->son+1 << endl ; return 0; }
发表评论
-
USACO Training Section 4.2 Cowcycles
2010-01-31 21:11 888英文原题 中文题译 ... -
USACO Training Section 4.2 Job Processing
2010-01-30 17:31 1136英文原题 中文题译 大意: 有N个工件,每个工件要经 ... -
USACO Training Section 4.2 Drainage Ditches ISAP非递归和多路增广递归
2010-01-29 19:39 1852郁闷。不小心覆盖了重 ... -
USACO Training Section 4.2 The Perfect Stall 匈牙利算法的递归和非递归实现
2010-01-28 21:21 1647英文原题 中文题译 ... -
USACO Training Section 4.1 Cryptcowgraphy 奶牛密码
2010-01-27 20:58 1200英文原题 中文题译 大意: 奶牛们要从农场逃跑 ... -
USACO Training Section 4.1 Beef McNuggets
2010-01-26 21:37 975英文原题 中文题译 大意: 给定N个正整数, ... -
USACO Training Section 4.1 Fence Loops
2010-01-24 20:14 1074英文原题 大意: 农夫布朗的牧场上的篱笆已经失 ... -
USACO Training Section 3.4 Closed Fences
2010-01-23 17:50 1408英文原题 题意 一个 ... -
USACO Training Section 3.4 American Heritage
2010-01-21 23:19 786英文原题 大意:有一个由最多26个大写字母构成的二叉树 ... -
USACO Training Section 3.4 Raucous Rockers
2010-01-21 23:09 801英文原题 大意:有S首歌,要放到D个CD里。每首歌有一个 ... -
USACO Training Section 3.4 Electric Fence
2010-01-21 12:57 976英文原题 大意:给定一个三角形(0,0),(m,n),( ... -
USACO Training Section 3.3 Riding the Fences
2010-01-20 23:38 1211英文原题 中文题译 经典的求欧拉路径:给定最多两个奇 ... -
USACO Training Section 3.3 Shopping Offers
2010-01-19 22:18 919英文原题 中文题译 这是个与日常生活相关的题。商场促销 ... -
USACO Training Section 3.3 A Game
2010-01-19 20:54 1097英文原题 有如下一个双人游戏:N(2 <= N & ... -
USACO Training Section 3.3 Home on the Range
2010-01-19 19:36 778英文原题 中文题译 大意:给定一个01矩阵,计算其中全为 ... -
USACO Training Section 3.3 Camelot
2010-01-19 03:39 1235英文原题 中文题译 ... -
USACO Training Section 3.2 Sweet Butter
2010-01-19 00:10 1051英文原题 中文题译 大意:农场之间有路构成稀疏无向图,若 ... -
USACO Training Section 3.2 Magic Squares
2010-01-18 23:11 934英文原题 中文题译 大意:有人发明了一种有8个块三种变换 ... -
USACO Training Section 3.2 Feed Ratios
2010-01-18 20:52 1312英文原题 中文题译 大意:给出整数a[i][j]和 ... -
USACO Training Section 3.2 Spinning Wheels
2010-01-18 19:37 871英文原题 中文题译 大意:有五个纺车飞轮,每个都有最多五 ...
相关推荐
usaco section2.3--section5.5源程序。。。。。。。。。。。。。。。。
USACO1.4~2.3C语言题解 绝对能通过
ACM----USACO Training(解题博客网),提供了USACO Training解题的代码,可以参考一下
USACO全部译题 USACO Training Program Gateway
自己写的usaco_training带代码。供参考,有一道题是cheat的。自己看吧。
usaco2.3解题报告1
usaco测试数据+标程 usaco的section1到section5的所有测试数据 以及标准程序
usaco解题报告,就是usaco.training.gateway上面的题目全解
USACO题解+代码+翻译,好东西,超级齐全,对大家帮助不小,特别是现在nocow挂了
[USACO 1.1.4]破碎的项链.cpp
2.3 Section 2.3 2.4 Section 2.4 3 Chapter3 3.1 Section 3.1 3.2 Section 3.2 3.3 Section 3.3 3.4 Section 3.4 4 Chapter4 4.1 Section 4.1 4.2 Section 4.2 4.3 Section 4.3 4.4 Section 4.4 5 Chapter5 5.1 ...
USACO_培训USACO_培训Ride.java-> Gift1.java->
USACO training 教程翻译合集(清晰明确)
USACO培训页面美国计算机奥林匹克训练页2015年6月17日开始
One of the answer of the USACO training exercises.
usaco 合集,包括英文原题和中文译题,测试数据以及答案,很全啊!usaco 合集usaco 合集usaco 合集usaco 合集
数据结构机考用的USACO网站上的题目,对机考刷题很有帮助的!要多锻炼编程能力!
usaco历年测试数据
USACO题集及答案
usaco 2010-2011 nov news,喜欢usaco的朋友可以看看