题意:一座无限高的大楼,m座电梯,给出每个电梯一次上升和下降得层数u、d,求n次以后最少上升多少层。
挺简单的题,暂且算是数学吧,刘汝佳也是放到了紫书第十章。
用x表示上升次数,y表示下降次数,上升层数就是x*u - y * d,因为x + y = n,所以x * (u + d) - n * d,二分x找大于0的最小值就可以了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int deal(int n, int u, int d) {
int b = 0, e = n;
int x = 0x3f3f3f3f;
while(b <= e) {
int m = (b + e) >> 1;
if(m * (u + d) - n * d > 0) {
x = m * (u + d) - n * d;
e = m - 1;
}
else b = m + 1;
}
return x;
}
int main() {
int n, m, u, d, i;
while(~scanf("%d%d", &n, &m)) {
int ans = 0x3f3f3f3f;
while(m--) {
scanf("%d%d", &u, &d);
int t = deal(n, u, d);
if(t < ans)
ans = t;
}
printf("%d\n", ans);
}
return 0;
}
本文介绍了一个关于无限高楼中使用特定规律的电梯达到指定楼层的算法问题。通过数学方法及二分查找技巧,寻找最少上升层数的解决方案。

2008

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



