1. 程式人生 > >CF 1036B Diagonal Walking v.2——思路

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

註意 http con 過程 偶數 string fine scanf .com

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