Advertisement
Guest User

Untitled

a guest
Dec 18th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. # include <bits/stdc++.h>
  2. # define ll long long
  3. # define fr first
  4. # define se second
  5. using namespace std;
  6. int dp[120][120][10] , a[120];
  7. vector<int> v;
  8. int main()
  9. {
  10.     ll n , i , j , k = 0;
  11.     cin>> n;
  12.     for(i = 0; i<= n + 10; i ++)
  13.         for(j = 0; j <= n + 10; j ++)
  14.             dp[i][j][1] = dp[i][j][0] = 1000000000;
  15.     dp[0][0][0] = 0;
  16.     for(i = 1; i <= n; i ++){
  17.         cin>> a[i];
  18.         for(j = 0; j <= k; j ++){
  19.             if(a[i - 1] > 100){
  20.                 if(j == 0){
  21.                     //cout <<"sa "<<i<<'\n';
  22.                     dp[i][j][0] = min(dp[i][j][0] , dp[i - 1][j][1] + a[i]) ;
  23.                     dp[i][j][1] = min(dp[i][j][1] , min(dp[i - 1][j][0] , dp[i - 1][j + 1][1]));
  24.                 }
  25.                 else{
  26.                     dp[i][j][0] = min(dp[i][j][0] , min(dp[i - 1][j - 1][0] + a[i] , dp[i - 1][j][1] + a[i]));
  27.                     dp[i][j][1] = min(dp[i][j][1] , min(dp[i - 1][j][0] , dp[i - 1][j + 1][1]));
  28.                 }
  29.             }
  30.             else{
  31.  
  32.                 dp[i][j][0] = min(dp[i][j][0] , min(dp[i - 1][j][0] +  a[i] , dp[i - 1][j][1] + a[i]));
  33.                 dp[i][j][1] = min(dp[i][j][1] , min(dp[i - 1][j + 1][0] , dp[i - 1][j + 1][1]));
  34.                 //cout <<i<<' '<<j<<' '<<dp[i][j]<<'\n';
  35.             }
  36.          //   cout <<i<<' '<<j<<' '<<dp[i][j][0]<<' '<<dp[i][j][1]<<'\n';
  37.  
  38.         }
  39.         if(a[i] > 100 && i != n)
  40.             k++;
  41.     }
  42.     int mx = 1000000000 , t1 , nom;
  43.     for(int i = 0; i <= k; i ++){
  44.        // cout << dp[n][i][0]<<' '<<dp[n][i][1]<<'\n';
  45.         int t;
  46.         if(dp[n][i][1] > dp[n][i][0]) t = 0;
  47.         else t = 1;
  48.         if(mx >= min(dp[n][i][1] , dp[n][i][0])){
  49.             mx = min(mx , min(dp[n][i][1] , dp[n][i][0]));
  50.             nom = i;
  51.             t1 = t;
  52.         }
  53.  
  54.     }
  55.  
  56.     cout <<mx<<'\n';
  57.     int qol = 0;
  58.     for(i = n; i >= 1; i --){
  59.         //cout <<mx<<' '<<nom<<' '<<t1<<'\n';
  60.         if(t1 == 0 && a[i] > 100) qol++;
  61.         if(t1 == 1) v.push_back(i);
  62.         if(t1 == 1) nom++;
  63.         else mx = mx - a[i];
  64.         if(dp[i - 1][nom - (a[i - 1] > 100)][0] == mx)
  65.             t1 = 0;
  66.         else
  67.             t1 = 1;
  68.         //cout<<t1<<'\n';
  69.         if(a[i - 1] > 100 && t1 == 0)
  70.             nom--;
  71.     }
  72.     //cout << qol<<'\n';
  73.     cout <<qol - v.size()<<' '<< v.size()<<'\n';
  74.     for(i = v.size() - 1; i >= 0; i --)
  75.         cout << v[i]<<'\n';
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement