Codeforces Round #272 (Div. 2) A. Dreamoon and Stairs

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

题意:
实现,共n个楼梯,每次只能走一格或则两格。
步数需要是m的倍数,满足以上条件后求最小步数。

PS:
举个例子就好理解,比如输入:29 7。
29最少走15步。
那么好,最近的比它大的7的步数是多少,21。
简单嘛,15步不变,其中的6个2步拆开变成15+6。
虽然不一定刚好是补 m - 1,但是最后的结果一定是
lower_bound/m + 1后再乘m。(向上补到m的倍数)
实质是找 大于步数下限且可被m整除的最小值。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <bits/stdc++.h>
using namespace std;

int main() {
int n, m;
cin >> n >> m;
int lower_bound = (n + 1) / 2;
int res = (lower_bound + m - 1) / m * m;
// 等效于 lower_bound/m + 1后再乘m。(向上补到m的倍数)
if (res > n) res = -1;
cout << res << "\n";
return 0;
};