Codeforces - 1082A - Vasya and Book

发布于 2024-05-02 04:46:11 字数 1899 浏览 13 评论 0

题目大意

就是给你四个数 nxyd ,在可以将这个四个数看做在一个坐标轴上,要你从 x 位置走到 y 位置,每次只能走 d 步,然后如果超过了边界就直接走到边界,问你从 x 走到 y 位置的最小步数;

解析

其实很简单,如果间隔距离刚好是 d 的整数倍,就肯定不要碰到两边,直接他们之间的距离 /d 就是答案,然后就走两边的情况,直接取一个最小值即可,这题 wa 了很多次,没注意 x > y 的情况。。。

#include <bits/stdc++.h>

int main(int argc, char const **argv)
{ 
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int t, n, x, y, d;
    for(std::cin >> t; t--; ){ 
        std::cin >> n >> x >> y >> d;
        if(x == y){ 
            std::cout << 0 << std::endl;
            continue;
        }
        if( abs(y-x)%d == 0) // notice abs , wrong answer so many times!!!!
            std::cout << abs(y-x)/d << std::endl;
        else {
            int back = (x-1)%d == 0 ? (x-1)/d : (x-1)/d+1;
            int forward = (y-1)/d;
            int back2 = (n-y)/d;
            int forward2 = (n-x)%d == 0 ? (n-x)/d : (n-x)/d+1;
            if( (y-1)%d && (n-y)%d ) 
                std::cout << -1 << std::endl;
            else if( (y-1)%d == 0 && (n-y)%d == 0)
                std::cout << std::min(back+forward, back2+forward2) << std::endl;
            else if( (y-1)%d == 0)
                std::cout << back+forward << std::endl;
            else 
                std::cout << back2+forward2 << std::endl;
        }
    }
    return 0;
}

题目链接

http://codeforces.com/problemset/problem/1082/A

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

丑疤怪

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文