训练交流.CodeForces.E.瘸腿国王[简单][注意输入输出格式]

题目描述:


解题思路:

题目解读:

求从[0,0]出发,到达二阶矩阵任意点[a,b]的最小步数。矩阵长和宽的范围都是[-100,100]。

而且他这个每一步要求,不能和上一步动作相同,就是上一步是往下,那这一步只能往上、左、右或者不动。

画个图不难理解,如果|a|=|b|,此时目标在对角线上,直接2|a| or 2|b| or |a|+|b| 即可。

那当不在对角线上时,最短路径肯定首先得奔着目标方向去,比如目标为[3,5],那我先到[3,3],如果到[3,3]的这步不是向右,那可以直接向右一步到[3,4];但此时不能直接向右一步到达[3,5],但在此时与变换方向迂回到达[3,5]相比,选择不动+向右更快。即移动思路为,先到最近的对角线位置,然后靠近一位,再以不动+动的方式不断靠近。

还有一种思路:数学归纳可以得出,不在对角线上时,最小步数为2 * Max(|a|, |b|) - 1)

代码实现:

 

//普通方法
#include<bits/stdc++.h>
using namespace std;

int Max(int a, int b) {
    return a > b ? a : b;
}

int Min(int a, int b) {
    return a < b ? a : b;
}

void solve() {
    int a, b;
    scanf("%d%d", &a ,&b); //去掉中间的空格
    a = abs(a);
    b = abs(b);
    if (a==b) printf("%d\n",a+b);
    else printf("%d\n", (2 * Min(a, b) + 1) + (2 * (Max(a,b) - (Min(a, b) + 1))));
}

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        solve();
    }
    return 0;
}
//数学归纳
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>

int Max(int a, int b) {
    return a > b ? a : b;
}

void Solve() {
    int a, b;
    scanf("%d%d", &a, &b);
    a = abs(a);
    b = abs(b);
    if (a == b) printf("%d\n", a + b);
    else  printf("%d\n", 2 * Max(a, b) - 1);
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        Solve();
    }
    return 0;
}

遇到的错误:输入输出格式不严谨

 scanf("%d %d", &a ,&b); //需要去掉中间的空格,不然读入会是个脏数据,没法正确获得后面输入的b。

printf("%d\n", a + b); //需要加换行符,否则几个输出结果堆一起也错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值