UVA 1648 数学推公式
题意
有m个电梯,每个电梯有2个按钮,分别为上u楼,下d楼,问现在只能选1个楼梯,按n此按钮的情况下,可以到达的最低楼层是多少?(最低楼层必须大于1)
分析
也就是 要使得 ux-d(n-x)最小,并且满足
{
0
<
=
x
<
=
n
u
x
−
d
(
n
−
x
)
>
=
1
\begin{cases} 0<=x<=n\\ ux-d(n-x)>=1 \\ \end{cases}
{0<=x<=nux−d(n−x)>=1
也就是
x
≥
1
+
d
∗
n
u
+
d
x \geq \frac{1+d*n}{u+d}
x≥u+d1+d∗n , 而容易 证明
0
≤
1
+
d
∗
n
u
+
d
<
n
0\leq \frac{1+d*n}{u+d}<n
0≤u+d1+d∗n<n
做题过程
这是一道简单的数学题,一直wa,
-
文章中说 “All floors are numbered by integer numbers starting from zero, zero being the ground floor.” 但是代码写的思路是从1开始,所以要让ux-d(n-x)>=1,而不是0
-
刚开始是用枚举法去找x,没有发现 0 ≤ 1 + d ∗ n u + d < n 0\leq \frac{1+d*n}{u+d}<n 0≤u+d1+d∗n<n ,因此不用枚举,用算式得到的就是了
-
没有看到多组样例, “Input contains several datasets”
#include "bits/stdc++.h"
using namespace std;
typedef long long ll ;
int main()
{
// freopen("in.text","r",stdin);
int n,m;
while (scanf("%d %d",&n,&m)!=EOF){
int ans=2e9;
for (int i = 1; i <= m; ++i) {
int u, d;
scanf("%d %d", &u, &d);
int x = (1 + d * n) / (u + d);
if ((1 + d * n) % (u + d) )++x;
ans = min(ans, u * x - d * (n - x));
}
printf("%d\n", ans);
}
return 0;
}