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