UVa 1648 (推公式) Business Center

题意:

有一种奇怪的电梯,每次只能向上走u个楼层或者向下走d个楼层

现在有m个这种电梯,求恰好n次能够到达的最小楼层数(必须是正数),最开始默认位于第0层。

分析:

假设电梯向上走x次,则向下走n-x次,则所到达的楼层为xu - (n-x)d ≥ 0

(u+d)x ≥ nd,x的最小值为

换句话说,如果nd % (u+d) == 0, x = nd / (u+d)

否则 x = nd / (u+d) + 1

考虑到不能停到0楼的条件:当nd % (u+d) == 0会出现这种情况,所以只能多上一次u个楼层,少下一次d个楼层,所以这样最终会停在u+d层

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int n, m;
 6 
 7     while(scanf("%d%d", &n, &m) == 2)
 8     {
 9         int ans = 1000000000;
10         while(m--)
11         {
12             int u, d;
13             scanf("%d%d", &u, &d);
14             if((n*d) % (u+d) == 0) { if(u+d < ans) ans = u+d; }
15             else
16             {
17                 int x = (n*d) / (u+d) + 1;
18                 int t = x*(u+d)-n*d;
19                 if(t < ans) ans = t;
20             }
21         }
22         printf("%d
", ans);
23     }
24 
25     return 0;
26 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4299114.html