Codeforces Round #237 (Div. 2)

Valera and X

给出一个字母的正方形,判断对角线的元素是否相同;除对角线的元素是否相同;对角线和对角线之外的元素是否相同(这里忘记判,wa了一次);

Marathon

给出一个左下角在原点的正方形,边长为a米,从原点出发,逆时针走,问走过d * k 米后,点的坐标位置; 1 <= k <= n。

a, d为小数, n为给出整数;输出 n种情况(k 从1到n)。

圈数 = k * d  / (4 *a) + 1;

只考虑最后一圈,然后分情况讨论,从a, 2a, 3a, 4a考虑。

一段时间不做题竟然忘记了int <= 2 * 10^9。这个题目的 k * d最大是超过int的,最后还是用了floor过的。赛后测试,(long long)也是可以过的。

Restore Graph

n个点的无向连通图,给出某个点到所有点的最短距离d[i],构造一个无向连通图,没有自环和多重边,每个点的边数不能超过k。

题目有个地方,边长默认为 1,没有说清楚。扫视了很多遍,就是没有1这个数字..

把给出的d[i] 从小到大sort。

第一个肯定是起始点。(需要判断是否为0)

第二个假设d[i] = dist, 肯定是在dist - 1的基础上+1.所以只要判断前面有没有连接边数小于k并且d[j] = dist - 1的。

如此重复,就能构造出一棵树。

可以证明,没有一种情况,是必须用图,而不能用树。

证明思路:假设有a到b,同时有b到a,如果a到b的路径小于b到a,那么b到a没必要存在,每次从a到b即可;无向图;

同理,大于的情况;

同理,等于的情况;

即是说,a到b只会存在一条路径;即是说,这是一棵树!

比赛的时候,是没读到边长 = 1的这句话。所以对这个题想了一个这样的构造。

从d[i]最小的开始,我们直接构造k条边,边长为d[i + 1] - d[i]  ,  d[i + 2] - d[i], d[i + 3] - d[i] , ... , d[i + k] - d[i]. 记录各个点的使用情况;

接下去的d[i + 1],构建 k - 1条边, 边长为d[i + 1 + k] - d[i + 1]  . . . . .

一种贪心的思路。

证明, d[i]排序完后,有d[i] < = d[j] <= d[k]. 假如存在 i ->j , j ->k 那么必然可以变成 i->j, i ->k. 因为对k来说,i,j没有区别。

实际写的时候,因为会存在d[j] == d[k]的情况,所以d[i]可能要往后找很远才能找到合适的点建边;

可以用优先队列;

对于d[j] ,可以在选取最靠近d[j]的值建边;贪心。

后面的两个题,没读。赛后也没兴趣做了 = =

原文地址:https://www.cnblogs.com/loying/p/3613077.html