Codeforces 1036B Diagonal Walking v.2 贪心

Posted zhenghanghu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1036B Diagonal Walking v.2 贪心相关的知识,希望对你有一定的参考价值。

题目传送门: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 贪心的主要内容,如果未能解决你的问题,请参考以下文章

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

codeforces cf edu round#50 B. Diagonal Walking v.2

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

详解Python-Numpy库的函数diagonal()并附函数diagonal()与函数diag()的区别

LeetCode 498. Diagonal Traverse

python使用numpy中的diagonal函数获取2D numpy数组的对角线元素使用numpy中的diagonal函数和sum函数获取2D numpy数组的迹(matrix trace)