zoukankan      html  css  js  c++  java
  • 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]的值建边;贪心。

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

  • 相关阅读:
    LeetCode 101. 对称二叉树
    PTA 两个有序序列的中位数(25分)
    CF1567
    亚线性筛
    LowbitMatrix(线段树)
    Matrix(组合数学)
    [模版] 数论基础模版
    Gym102001
    Gym102483A
    [模版] Miller-Rabin素性测试&Pollard-Rho分解质因数
  • 原文地址:https://www.cnblogs.com/loying/p/3613077.html
Copyright © 2011-2022 走看看