zoukankan      html  css  js  c++  java
  • CF 1036B Diagonal Walking v.2——思路

    题目:http://codeforces.com/contest/1036/problem/B

    比赛时只能想出不合法的情况还有走到终点附近的方式。

    设n<m,不合法就是m<k。走到终点方式就是先斜着走了n*n的正方形,然后一拐一拐地走到终点或距离终点仅剩一个格子的地方。走到终点后可以走任意偶数步,走出去终点又走回来这样。

    然后开始超麻烦地考虑,比如走很多横着的步使得起点向终点移动一些,然后……

    最后发现过不了样例。

    赛后看看别人的代码,发现异常简单。就是到上面那一步之后,

      如果一拐一拐地正好走到终点,就看剩下的步数,如果是奇数,表示过程中需要走一个三角形,就走了两步横平竖直的,答案=k-2;

      不然,需要走一个横平竖直的步到终点,再走任意偶数步。注意此时可以直接走到终点,也可以借三角形两步走到终点,都是走了一个横平竖直的步;即可以调节走到终点后剩余步数的奇偶性。

    所以就是代码的那个样子了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    int q;
    ll n,m,k;
    int main()
    {
        scanf("%d",&q);
        while(q--)
        {
            scanf("%I64d%I64d%I64d",&n,&m,&k);
            if(n>m) swap(n,m);
            if(m>k) {printf("-1
    ");continue;}
            if((m-n)&1) k--;
            else if((k-m)&1) k-=2;
            printf("%I64d
    ",k);
        }
        return 0;
    }
  • 相关阅读:
    TOYS POJ
    口罩发放
    Qin Shi Huang's National Road System HDU
    次小生成树
    ACM Contest and Blackout UVA
    Strongly connected HDU
    tarjan
    Network HDU
    【洛谷 1351】联合权值
    【洛谷 3884】二叉树问题
  • 原文地址:https://www.cnblogs.com/Narh/p/9607943.html
Copyright © 2011-2022 走看看