Alex_tz307

Cherchez vol 2 - Paragrafare Optimala - pag 201

Sep 24th, 2020
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define p3(x) ((x) * (x) * (x))
  3.  
  4. using namespace std;
  5.  
  6. int main() {
  7.     ios_base::sync_with_stdio(false);
  8.     cin.tie(nullptr);
  9.     cout.tie(nullptr);
  10.     int N, M;
  11.     cin >> N >> M;
  12.     vector < string > a(N + 2);
  13.     vector < int > lg(N + 2);
  14.     for(int i = 1; i <= N; ++i) {
  15.         cin >> a[i];
  16.         lg[i] = lg[i - 1] + a[i].size();
  17.     }
  18.     vector < int > dp(N + 2), last(N + 2);
  19.     last[N] = N;
  20.     for(int i = N - 1; i > 0; --i)
  21.         if(lg[N] - lg[i - 1] + N - i <= M) {
  22.             dp[i] = 0;
  23.             last[i] = N;
  24.         }
  25.         else {
  26.             dp[i] = p3(M - lg[i] + lg[i - 1]) + dp[i + 1];
  27.             last[i] = i;
  28.             for(int j = i + 1; j < N; ++j) {
  29.                 if(lg[j] - lg[i - 1] + j - i > M)
  30.                     break;
  31.                 if(dp[i] > dp[j + 1] + p3(M - (lg[j] - lg[i - 1] + j - i))) {
  32.                     dp[i] = dp[j + 1] + p3(M - (lg[j] - lg[i - 1] + j - i));
  33.                     last[i] = j;
  34.                 }
  35.             }
  36.         }
  37.     cout << dp[1] << '\n';
  38.     int poz = 0;
  39.     while(poz < N) {
  40.         for(int i = poz + 1; i < last[poz + 1]; ++i)
  41.             cout << a[i] << ' ';
  42.         cout << a[last[poz + 1]] << '\n';
  43.         poz = last[poz + 1];
  44.     }
  45. }
  46.  
Advertisement
Add Comment
Please, Sign In to add comment