1. 程式人生 > >Codeforces 1036B Diagonal Walking v.2 【貪心】

Codeforces 1036B Diagonal Walking v.2 【貪心】

swap def syn ret ring n) cin ORC wap

題目傳送門:https://codeforces.com/contest/1036/problem/B

被這道題坑了,說白了還是菜。

貪心策略是先斜對角從(0,0)走到(n,n),然後往右拐(分奇偶考慮)【若n>m,swap(n,m)】

理論上是畫畫圖,知道切入點是奇偶性後,就能想清楚了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<vector>
#define
INF 2e9 using namespace std; int main(){ ios::sync_with_stdio(false); int q; cin>>q; while(q--){ long long n,m,k; cin>>n>>m>>k; //from (0,0) to (n,m) if(n>m) swap(m,n); // get n<=m //from (0,0) to (n,n) long
long cnt=n; if( (m-n)%2==1 ){//from (n,n) to (n,m-1) cnt+=m-n-1; k-=cnt; if(k<=0){ cout<<-1<<endl; } else{ k-=1; cnt+=k; cout<<cnt<<endl; } } else
{//from (n,n) to (n,m) cnt+=m-n; k-=cnt; if( k<0 ) cout<<-1<<endl; else if( k==0 ) cout<<cnt<<endl; else{ long long zero=0; if(k%2==0) cout<<cnt+k<<endl; else{ if(k==1) cout<<cnt-1<<endl; else cout<<cnt+k-2<<endl; } } } } return 0; }

Codeforces 1036B Diagonal Walking v.2 【貪心】