CF 1036B Diagonal Walking v.2——思路
阿新 • • 發佈:2018-09-08
註意 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——思路