链接
http://acm.hdu.edu.cn/showproblem.php?pid=5935
题解
假设第
i
i
i段行使的路程为
x
i
x_i
xi(等于输入数据的第
i
i
i项与第
i
−
1
i-1
i−1项的差),假设
a
a
a和
b
b
b是相邻两端
那么
x
a
t
a
≤
x
b
t
b
\frac{x_a}{t_a}\leq \frac{x_b}{t_b}
taxa≤tbxb
即
t
a
≥
x
a
t
b
x
b
t_a \geq \frac{x_at_b}{x_b}
ta≥xbxatb
相当于后面
t
b
t_b
tb的取值对
t
a
t_a
ta造成了一个下界
我要让
t
t
t的和最小,显然可以贪心的令
t
n
=
1
t_n=1
tn=1,然后前面的依次取下界就行了
因为沙雕错误 W A WA WA了好几发:求 x i x_i xi的时候要倒着循环来作差…否则会出问题
代码
#include <bits/stdc++.h>
#define maxn 100010
#define linf (1ll<<60)
#define sqr(x) ((x)*(x))
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long ll;
ll N, x[maxn], t[maxn];
ll read(ll x=0)
{
ll c, f(1);
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-0x30;
return f*x;
}
int main()
{
ll T=read(), kase=0, i, ans;
for(kase=1;kase<=T;kase++)
{
N=read();
for(i=1;i<=N;i++)x[i]=read();
for(i=N;i;i--)x[i]-=x[i-1];
ans=t[N]=1;
for(i=N-1;i;i--)
{
t[i] = t[i+1]*x[i]/x[i+1] + !!(t[i+1]*x[i]%x[i+1]);
ans+=t[i];
}
printf("Case #%lld: %lld\n",kase,ans);
}
return 0;
}
本文详细解析了HDU 5935题目,通过贪心策略计算使总时间最小的方案。讨论了如何根据路段速度设置时间下界,并给出具体实现代码。
812

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



