2017.2.11【初中部 GDKOI】模拟赛B组题解

T1 最小比例

题目大意

给出你n个点的权值和联通每个点的边的边权,让你选出m个点和m-1条边,求出所有权值与所有点的权值之和的比率最小

100%

递归选哪个点,先联通那几个点直接的点,然后跑一次最小生成树,就可以过了。

T2 软件公司

题目大意

给你项目一和项目二需要完成的每个项目的份数,再给出每个人完成项目一每份,项目二每份的时间,让你求出一个时间T,能完成两个项目。其中T最小

30%

用动态规划,设f[i,x,y]表示前i个人能否选到完成了x份项目1,y份项目2。当然枚举一个时间。

60%

扫描二维码关注公众号,回复: 876782 查看本文章

在30%基础上,可以二分答案

100%

如果F数组只是存0和1,会不会过于浪费?设f[i,j]表示前i个人,完成了j份项目1的时候,最多能完成多少个项目二。若f[n,m]≥m即符合条件。考试怎么没想到呢。。。

T3 空间航行

题目大意

就是求出两点之间的最短距离,其中有些路没有长度

100%

弄一个三维两点距离公式,预处理已知的两点距离,Floyd就可以了。注意长度为负数情况。

T4 摧毁巴士站

题目大意

你可以摧毁某个点,那么连接那个点的边就不能走。问最少摧毁多少条边

30%

可以递归摧毁哪个点,然后最短路判断

100%

有些点,可能经过他的路径,长度都是大于k的,那么这些点就不必要进行递归。这就是30分的缺陷。

于是,我们每次找一次最短路,看看从1~n的最短路分别经过了哪几个点。因为这里面的点都是在不符合条件的最短路里,所以我们递归那些经过的点删或者不删,直到最短路符合k的条件为止,去一个删的数目最少的为答案即可。

存最短路径是一条怎样的路,可以用s[x]表示更新x这个点,最后是哪个点更新的,即可。

if dis[b[x,i]]>dis[x]+1 then
                                begin
                                        dis[b[x,i]]:=dis[x]+1;
                                        pre[b[x,i]]:=x;//x这个点更新了b[x,i]
                                        inc(tail);
                                        d[tail]:=b[x,i];
                                end;


猜你喜欢

转载自blog.csdn.net/fengyingjie2/article/details/54983092