CodeForces - 1036B Diagonal Walking v.2(思维)
題目鏈接:點(diǎn)擊查看
題目大意:給出m個(gè)詢問(wèn),每個(gè)詢問(wèn)給出x y k,每次可以向當(dāng)前點(diǎn)周圍的八個(gè)方向移動(dòng),每個(gè)點(diǎn)可以經(jīng)過(guò)任意次數(shù),問(wèn)從(0,0)點(diǎn)走到(x,y)點(diǎn),使用的步數(shù)恰好為k時(shí),走過(guò)的斜邊的最大數(shù)目
題目分析:找規(guī)律的題,首先選出m和n中較大的那條邊(這里我們假設(shè)m>=n),我們完全可以每次都斜著走,走m次后,一定能到(m,m)點(diǎn),由于從(0,0)的距離到(m,m)的距離肯定大于等于到(n,m)的距離,所以我們可以反過(guò)來(lái)想,如果k小于m的話,那么最遠(yuǎn)也只能到達(dá)(k,k)點(diǎn),所以無(wú)法達(dá)到(n,m)點(diǎn),這個(gè)是一種判斷,另一種是,如果m和n做差,結(jié)果是偶數(shù)的話,一定可以全部通過(guò)走斜邊的方式經(jīng)過(guò)(n,m)點(diǎn),注意這里是經(jīng)過(guò)而不是到達(dá),具體的下面再說(shuō)。我們接著分析,那如果是奇數(shù)的話,肯定需要用一次步數(shù)來(lái)橫著走一次或豎著走一次才行,所以如果m和n做差的結(jié)果是奇數(shù)的話,我們令k-1。如果是偶數(shù)的話,我們還需要討論k和m的關(guān)系,如果k和m的差值是偶數(shù)的話,那每當(dāng)走到(n,m)點(diǎn)后,可以找一個(gè)鄰近的斜邊進(jìn)行反復(fù)的來(lái)回走動(dòng),因?yàn)槭桥紨?shù),所以最后走完k次后肯定會(huì)回到(n,m)點(diǎn),所以答案就是k,但如果k和m的差值是奇數(shù),那就說(shuō)明先走到(n,m)點(diǎn)后來(lái)回反復(fù)走動(dòng),走完k次后,會(huì)回不到(n,m)點(diǎn),那么我們就需要橫著或豎著多走兩次才行,這樣就可以和最后的那一次斜著走抵消了,如果滿足這個(gè)條件令k-2即可,分類討論一下每種情況,最后輸出k即可
上代碼:
#include<iostream> #include<string> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<cstdio> using namespace std; typedef long long LL;const int N=25;int main() {int w;cin>>w;while(w--){LL n,m,k;scanf("%lld%lld%lld",&n,&m,&k);if(m<n)swap(n,m);if(m>k){printf("-1\n");continue;}if((m-n)&1)//兩邊相差為奇數(shù)時(shí),需要多走一個(gè)橫著或豎著 k--;else if((k-m)&1)//兩邊相差為偶數(shù)時(shí),如果剩余步數(shù)為奇數(shù),需要多走兩個(gè)橫著或豎著k-=2;printf("%lld\n",k);//兩邊相差為偶數(shù),且剩余步數(shù)為偶數(shù)時(shí),k次全部用來(lái)斜著走即可}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的CodeForces - 1036B Diagonal Walking v.2(思维)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中石油训练赛 - The King’s
- 下一篇: HDU - 5875 Function(