Problem:
I: Starting Line
ICPC で良い成績を収めるには修行が欠かせない．うさぎは ICPC で勝ちたいので，今日も修行をすることにした．
今日の修行は，一直線上の道を走って，体力と判断力を養おうというものである．うさぎは今，スタートラインに立って長い長い道を見渡している．
道の途中にはいくつかニンジンが置かれており，うさぎはニンジンを食べると加速することができる．加速していないときのうさぎの走る速さは毎秒
U
メートルであるが，ニンジンを食べることで，最後のニンジンを食べてから
T
秒後までは速さが毎秒
V
メートルとなる．また，うさぎはニンジンを
K
個まで食べずに持っておくことができる．ニンジンを持っていても走る速さは変わらない．
ニンジンを持ったり食べたりするのに時間はかからないとして，ゴールまでの最短所要時間を求めたい．
Input
N
K
T
U
V
L
D
1
...
D
N
N
はニンジンの個数，
L
はスタートからゴールまでの距離 (メートル)，
D
i
(1 ≤
i
≤
N
) は
i
番目のニンジンが置かれている場所のスタートからの距離 (メートル) である．
1 ≤
N
≤ 200，1 ≤
K
≤
N
，1 ≤
T
≤ 10,000，1 ≤
U
<
V
≤ 10,000，2 ≤
L
≤ 10,000，0 <
D
1
<
D
2
< ... <
D
N
<
L
を満たす．入力の値はすべて整数である．
Output
最短所要時間 (秒) を 1 行に出力せよ．10
-6
以下の絶対誤差が許容される．
Sample Input 1
1 1 1 2 3 100
50
Sample Output 1
49.500000000
Sample Input 2
3 1 1 2 3 100
49
50
51
Sample Output 2
48.666666667

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
using namespace std;

int main(){
  int N, K, T, U, V, L;
  cin >> N >> K >> T >> U >> V >> L;
  vector<int> D(N), G(L + 1, -1), S(L + 1);
  for(int i = 0; i < N; i++){
    cin >> D[i];
    G[D[i]] = i;
    S[D[i]]++;
  }
  for(int i = 0; i < L; i++)S[i + 1] += S[i];
  double INF = 1 << 29;
  K++;
  vector<vector<double>> dp(L + 1, vector<double>(K + 1, 1 << 30));
  auto f = [&](int from, int fromj, int to){
    to = min(L, to);
    int add = S[to] - S[from], nj = min(K, fromj - 1 + add);
    dp[to][nj] = min(dp[to][nj], dp[from][fromj] + (double)(to - from) / V);
  };
  dp[0][0] = 0;
  for(int i = 0; i < L; i++){
    for(int j = 0; j <= K; j++){
      if(dp[i][j] >= INF)continue;
      if(G[i] == -1 && j == K)continue;
      int nj = min(K, j + S[i + 1] - S[i]);
      if(j < K)dp[i + 1][nj] = min(dp[i + 1][nj], dp[i][j] + double(1) / U);
      if(j){
        f(i, j, i + V * T);
        for(int l = 0; l < N && D[l] <= i + V * T; l++){
            if(D[l] <= i)continue;
            f(i, j, D[l]);
        }
      }
    }
  }
  double ans = 1 << 30;
  for(int i = 0; i <= K; i++) ans = min(ans, dp[L][i]);
  cout << fixed << setprecision(15) << ans << '\n';
}
accuracy: 1
time_ms: 210
memory_kb: 19500
final_rank: 4

code_snippet: #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int N,K,U,L,V,T;
double cnt;
bool mp[10010];

int main(){
  cin>>N>>K>>T>>U>>V>>L;
  for(int i=0,a,A;i<N;i++){
    cin>>a;A=a;
    while(mp[a]&&(1.0*a-A)/V/T<K)a++;
    for(int j=a;j<L&&j<a+T*V;j++)cnt+=!mp[j],mp[j]=1;
  }

  printf("%.8f\n",cnt/V+(L-cnt)/U);
  return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 1200
final_rank: 3

code_snippet: #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int N,K,U,L;
double cnt,V,T;
bool mp[10010];

int main(){
  cin>>N>>K>>T>>U>>V>>L;
  for(int i=0,a,A;i<N;i++){
    cin>>a;A=a;
    while(mp[a]&&(a-A)/V/T<K)a++;
    for(int j=a;j<L&&j<a+T*V;j++)cnt+=!mp[j],mp[j]=1;
  }

  printf("%.8f\n",cnt/V+(L-cnt)/U);
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 1256
final_rank: 1

code_snippet: #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int N,K,U,L;
double cnt,V,T;
bool mp[10010];

int main(){
  cin>>N>>K>>T>>U>>V>>L;
  for(int i=0,a,A;i<N;i++){
    cin>>a;
    A=a;
    while(mp[a]&&(a-A)/V/T<K)a++;
    for(int j=a;j<L&&j<a+T*V;j++)cnt+=!mp[j],mp[j]=1;
  }

  printf("%.8f\n",cnt/V+(L-cnt)/U);
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 1256
final_rank: 1