Codeforces - 1082A - Vasya and Book
题目大意
就是给你四个数 n
、 x
、 y
、 d
,在可以将这个四个数看做在一个坐标轴上,要你从 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;
}
题目链接
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: HTML 和 CSS 终极教程
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论