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

T1:这题原来是如此的水。枚举选取的点,因为我们要让边权和:点权和最小,所以在点权和确定之后要让边权和最小,那么我们可以用克鲁斯卡尔求出最小生成树,再从所有的结果中选出一个最小的就行了。比赛时老想着如何得出一种选法使得选出的答案是最优,想不出来又去想暴力,最后只有70分。下次遇到多个因素时要多想想分开来处理。


T2:这题想到了二分+递归,结果超时10分,正解竟然是二分+dp!

二分一个最小值,然后用dp判断这个最小值是否可行。

设f[i][j]表示前i个人在完成了j个一项目的子项目的情况下,最多完成二项目的子项目的个数。那么我们需要枚举一个k,k表示到第i-1个人完成了k个一项目的子项目。那么第i个人就是完成了j-k个,那他能完成的二项目的子项目的个数就为(mid-(j-k)*a[i])/b[i],那么状态转移方程就是f[i][j]=max{f[i-1][k]+(mid-(j-k)*a[i])/b[i]}。


T3:比赛时看见是三维的就直接放弃了,想不到竟然是如此简单,纯的Floyed。

我们可以把起点和终点看成半径为0的星球,然后我们把每个星球看成一个点,求出它们之间的距离,最后Floyed一遍。

但关键是怎样求出两两星球之间的距离。我们假设要求出星球i和星球j之间的距离,那么它们中心点的距离就是sqrt((x[i]-x[j])^2+(y[i]-y[j])^2+(z[i]-z[j])^2),但是我们还要考虑到它们的半径,于是我们用上面式子的值减去r[i]和r[j],但是如果i、j星球相交的话那么减出来的值就会使负数,这是我们直接把i、j星球之间的值改为0就行了。


T4:这题正解竟然是递归爆搜。

我们可以用SPFA求出当前的最短路径,如果最短路径不大于k,那么说明当前的这条最短路径中必须有一个点被删掉,但是我们不知道删哪个点是最优的,所以我们需要用递归去枚举删哪个点,递归结构如下:

1、如果1到你n的最短路的长度大于k,则更新ans,回溯。否则跳至第二步。

2、枚举最短路上除1和n以为的点,递归枚举删除哪一个。

你可能感兴趣的:(【初中部,NOIP提高组,】模拟赛B)