首页 > 其他 > 详细

CF 1036B Diagonal Walking v.2——思路

时间:2018-09-08 10:11:37      阅读:136      评论:0      收藏:0      [点我收藏+]

题目: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\n");continue;}
        if((m-n)&1) k--;
        else if((k-m)&1) k-=2;
        printf("%I64d\n",k);
    }
    return 0;
}

 

CF 1036B Diagonal Walking v.2——思路

原文:https://www.cnblogs.com/Narh/p/9607943.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!