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

思路:当m > k时输出-1(设m是较大的数),当m-n是奇数时有一步不能走对角线所以k--,当走对角线可以直接到达终点,如果剩余的步数是奇数则有两步不能走对角线所以k - 2。(画图观察规律)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	int q;
	scanf("%d",&q);
	while(q--)
	{
		ll n,m,k;
		scanf("%lld%lld%lld",&n,&m,&k);
		if(n>m)
		  swap(n,m);
		if(k<m)
		{
			printf("-1\n");
			continue;
		}
		ll res;
		if( (m-n)%2==0 )
		{
			if(k%2==m%2)
			{
				printf("%lld\n",k);
			}
			else
			{
				printf("%lld\n",k-2);
			}
		}
		else if( (m-n)%2==1 )
		{
			if(k==m)
			{
				printf("%lld\n",k-1);
				continue;
			}
			else if(k>m)
			{
			    ll sheng=k-n;
			    ll cha=m-n;
			    if(sheng%2==cha%2)
			    {
			    	if(cha%2==0)
			    	{
			    		res=k;
					}
					else if(cha%2==1)
					{
						res=k-1;
					}
				}
				else
				{
					if(cha%2==1&&sheng%2==0)
					{
						res=k-1;
					}
					else if(cha%2==0&&sheng%2==1)
					{
						res=k-2;
					}
				}
				printf("%lld\n",res);
				continue;
			}
		}
	}
}

  

原文地址:https://www.cnblogs.com/lishengkangshidatiancai/p/10199506.html

时间: 2024-07-31 16:57:47

codeforces cf edu round#50 B. Diagonal Walking v.2的相关文章

Diagonal Walking v.2 CodeForces - 1036B (思维,贪心)

Diagonal Walking v.2 CodeForces - 1036B Mikhail walks on a Cartesian plane. He starts at the point (0,0)(0,0), and in one move he can go to any of eight adjacent points. For example, if Mikhail is currently at the point (0,0)(0,0), he can go to any o

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

题目:http://codeforces.com/contest/1036/problem/B 比赛时只能想出不合法的情况还有走到终点附近的方式. 设n<m,不合法就是m<k.走到终点方式就是先斜着走了n*n的正方形,然后一拐一拐地走到终点或距离终点仅剩一个格子的地方.走到终点后可以走任意偶数步,走出去终点又走回来这样. 然后开始超麻烦地考虑,比如走很多横着的步使得起点向终点移动一些,然后-- 最后发现过不了样例. 赛后看看别人的代码,发现异常简单.就是到上面那一步之后, 如果一拐一拐地正好走

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

题目:http://codeforces.com/contest/1036/problem/B 题意:从 (0,0) 走到 (n,m),每一步可以向八个方向走一格,问恰好走 k 步能否到达,能到达则输出最多能走多少斜步: 自己想得太复杂了... 首先,判断 -1 就看横纵距离中的较大值是否大于 k ,因为最少走 max(n,m) 步可以到达: 设 m > n: 如果 m - n 为奇数,那么显然会有一步必须直着走,那么 k --: 这里可以通过走法来调节剩余步数的奇偶,就是直着走过去或者拐一下走

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<q

codeforces cf educatonal round 57(div2) D. Easy Problem

这道题用滚动数组比较好写.dp[i]表示当前字母不形成hard前i个字母组成的子串的最小代价.每次更新dp[i],考虑两种情况,第一种是当前可能放在hard的第i个字母上,那么我们更新dp值为dp[i]+a[i]:第二种是前i-1个字母都没有构成的最小代价,用dp[i-1]更新,两者取最小值 #include<bits/stdc++.h> using namespace std; typedef long long ll; string s; ll a[100010]; ll dp[5]; i

B. Diagonal Walking v.2

链接 [https://i.cnblogs.com/EditPosts.aspx?opt=1] 题意 二维平面从原点出发k步,要到达的点(x,y),每个位置可以往8个方位移动,问到达目的地最多可以走多少斜路 如果不可以到达输出-1: 分析 找规律,看代码自己琢磨 代码 #include<bits/stdc++.h> using namespace std; #define ll long long int main(){ ios::sync_with_stdio(false); cin.tie

Codeforces Edu Round 50 A-D

A. Function Height 由于只能提升\(x\)为奇数的点,每个三角形的底一定为\(2\), 则要求我们求: \(2 * (h_1 + h_2 + - + h_n) / 2 = k\),使\(max(h_1, h_2-h_n)\)最小. 则应使每个\(h\)平摊重量,答案即为\(\lceil n/k \rceil\). #include <cstdio> #include <iostream> #include <cmath> typedef long lo

BestCoder Round #50 (div.2)

题目传送:BestCoder Round #50 (div.2) BC感觉越做越无语了 1001.Distribution money AC代码: #include <map> #include <set> #include <list> #include <cmath> #include <deque> #include <queue> #include <stack> #include <bitset> #

DP BestCoder Round #50 (div.2) 1003 The mook jong

题目传送门 1 /* 2 DP:这题赤裸裸的dp,dp[i][1/0]表示第i块板放木桩和不放木桩的方案数.状态转移方程: 3 dp[i][1] = dp[i-3][1] + dp[i-3][0] + 1; dp[i][0] = dp[i-1][1] + dp[i-1][0]; 4 比赛时二维dp写搓了,主要是边界情况的判断出错,比如dp[3][1] = 1,因为第3块放了木桩,其他地方不能再放,dp[3][0]同理 5 解释一下dp[i][1]的三种情况,可能是前面相隔2个放的方案或者是不放的