#include <bits/stdc++.h>
using namespace std;
#define f(n,m,i) for (int i = n;i <= m;i++)
#define fc(n,m,i) for (int i = n;i >= m;i--)
#define dbug(x) cerr<<(#x)<<':'<<x<<' ';
#define ent cerr<<endl;
inline void C(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cerr.tie(0);
}
double max(double x,double y){
return x>y?x:y;
}
double min(double x,double y){
return x<y?x:y;
}
long long n,maxt,km;
long long w[1005];
double t[1005];
long long wes[1005];
double dp[1005][1005];
int main(){
C();
cin >> maxt >> km >> n;
int s;
f(1,n,i){
f(1,n,j){
dp[i][j] = 1e15;
}
}
f(1,n,i){
cin >> w[i] >> s;
t[i] = (km * 1.0) / s;
wes[i] = wes[i - 1] + w[i];
dp[i][i] = t[i];
//dbug(t[i])
}
f(2,n,len){
f(1,n - len + 1,i){
int l = i,r = i + len - 1;
if (wes[r] - wes[l - 1] <= maxt){
f(l,r - 1,k){
dp[l][r] = min(dp[l][r],max(dp[l][k],dp[k + 1][r]));
}
}
else{
f(l,r - 1,k){
dp[l][r] = min(dp[l][r],dp[l][k] + dp[k + 1][r]);
}
}
}
}
printf("%.1lf",dp[1][n] * 60);
return 0;
}
本来写区间玩一玩,以为会T几个点,没想到过了,最慢的那个点都只有699ms。
本题或将多一个O(n^3)的做法