题目链接:http://codeforces.com/gym/101775/problem/C

题意:

给出 $N$ 个红绿灯,又给出 $N+1$ 个距离 $S_i = S_0,S_1, \cdots, S_N$,代表从第 $i$ 个路灯到第 $i+1$ 个路灯的距离(第 $0$ 个距离代表从家到第一个红绿灯的距离,第 $N$ 个距离代表从最后一个红绿灯到公司的距离)。

现在每个红绿灯有 $A_i$ 秒的绿灯时长,$B_i$ 秒的红灯时长,所有的红绿灯的 $A_i + B_i$ 都相等,你可以通过设置一个 $OFF_i$ 秒的偏移量来使得每个红绿的时间周期前后偏移。

现在你有可能在任何时刻从家出发,可以通过设置所有 $OFF_i$ 使得你在最坏情况下耗时最少,问是这个耗时是多少。

题解:

最坏情况是所有红绿灯中,红灯时间最长的那个红绿灯的红灯时间,全被你等了。然后剩下的所有交通灯都可以通过设置偏移量来让你经过时正好为绿灯。

别问我具体怎么证明,我不会……等有空了并且脑子清醒的时候也许可以试试?

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int MAX_N=1e3+;
double S[MAX_N];
double A[MAX_N],B[MAX_N];
int main()
{
int T;
cin>>T;
for(int kase=;kase<=T;kase++)
{
int N;
cin>>N;
for(int i=;i<=N;i++) scanf("%lf", S+i);
double _max=-;
for(int i=;i<=N;i++)
{
scanf("%lf%lf",A+i,B+i);
_max=max(_max,B[i]);
}
for (int i=;i<=N;i++) _max+=S[i];
printf("Case #%d: %.6lf\n",kase,_max);
}
}

(盗用一下队友的代码,嘿嘿……)

05-01 07:35