题目链接:codeforces 1082A
题意:
一本书总共有 n 页,初始在 x 页, 最终要翻到 y 页,每次只能往前或往后翻 d 页,问最少翻多少次可以翻到,如果不能输出-1。
往前或往后都是有边界的,即假设 n = 20, d = 10现在在第15页, 往后翻一次就到了 20页
题解:
分类讨论,①能直接从 x 页翻到 y 页
②能从最后一页翻到 y 页
③能从第一页翻到 y 页
④ 否则不能
AC代码
c++
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e9+1;
int main(){
int t;
cin >> t;
while(t--){
int n, x, y, d, ans1 = maxn ,ans2 = maxn, ans3 = maxn;
cin >> n >> x >> y >> d;
if((y - x) % d == 0){
ans1 = abs((y - x) / d); // 绝对值,因为可以往前翻
}
if((y - 1) % d == 0){ // 从第一页翻到 y 页,强制转换数据类型
ans2 = (y - 1) / d + ceil((double)x / d);
}
if((n - y) % d == 0){ // 从最后一页翻到 y 页
ans3 = (n - y) / d + ceil((double)(n - x) / d);
}
if(ans1 == ans2 && ans2 == ans3 && ans1 == maxn){
cout << -1 << endl;
}
else{
cout << min(ans1, min(ans2, ans3)) << endl;
}
}
return 0;
}
php
<?php
$cin = fopen("php://stdin", "r");
$t = intval(fgets($cin));
while ($t != 0) {
$t--;
$s = fgets($cin);
$a = explode(' ', $s);
$n = intval($a[0]);
$x = intval($a[1]);
$y = intval($a[2]);
$d = intval($a[3]);
$ans1 = 1e9+1;
$ans2 = 1e9+1;
$ans3 = 1e9+1;
if(($y - $x) % $d == 0){
$ans1 = abs(($y - $x) / $d);
}
if(($n - $y) % $d == 0){
$ans2 = ($n - $y) / $d + ceil(($n - $x) / $d);
}
if(($y - 1) % $d == 0){
$ans3 = ($y - 1) / $d + ceil((double)$x / $d);
}
if($ans1 == $ans2 && $ans2 == $ans3 && $ans1 == 1e9+1){
print_r("-1"."\n");
}
else{
print_r(min($ans1, $ans2, $ans3)."\n");
}
}
fclose($cin);
?>
320



被折叠的 条评论
为什么被折叠?



