Submission #1278183

#TimeUsernameProblemLanguageResultExecution timeMemory
1278183julia_08Let's Win the Election (JOI22_ho_t3)C++20
100 / 100
1230 ms8468 KiB
#include <bits/stdc++.h>
using namespace std;

using ld = long double;

const int MAXN = 510;
const ld INF = 1e18;

pair<ld, ld> p[MAXN];

ld dp_1[MAXN][MAXN], dp_2[MAXN][MAXN];

int main(){
  cin.tie(0)->sync_with_stdio(0);

  int n, K; cin >> n >> K;

  for(int i=1; i<=n; i++){
    cin >> p[i].second >> p[i].first;
    if(p[i].first == -1) p[i].first = INF;
  }

  sort(p + 1, p + n + 1);

  ld ans = INF;

  for(int x=1; x<=(n + 1); x++){

    for(int k=0; k<=x; k++) dp_1[0][k] = INF;
    
    for(int j=0; j<=K; j++) dp_2[0][j] = INF;

    dp_1[0][1] = 0;

    for(int i=1; i<=n; i++){

      // se ainda nao tenho x, nao faz sentido ignorar o estado

      for(int k=0; k<=x; k++){
        dp_1[i][k] = dp_1[i - 1][k] + p[i].second / x;
        if(k > 0) dp_1[i][k] = min(dp_1[i][k], dp_1[i - 1][k - 1] + p[i].first / (k - 1));
      }

      // se já tenho x, não faz sentido ficar gastando com b

      dp_2[0][0] = dp_1[0][x];

      for(int j=0; j<=K; j++){

        dp_2[i][j] = dp_2[i - 1][j];
        if(j > 0) dp_2[i][j] = min(dp_2[i][j], dp_2[i - 1][j - 1] + p[i].second / x);

        if(j == i) dp_2[i][j] = min(dp_2[i][j], dp_1[i][x]);

      }

    }

    ans = min(ans, dp_2[n][K]);
    
  }

  cout << fixed << setprecision(15) << ans << "\n";

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...