码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-09-08 10:29:24      阅读:359      评论:0      收藏:0      [点我收藏+]

标签:print   iostream   while   ring   很多   距离   http   表示   continue   

题目: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——思路

标签:print   iostream   while   ring   很多   距离   http   表示   continue   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!