Advertisement
Manioc

Produção Ótima de Ótima Vodka

Jul 30th, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 2007
  3. using namespace std;
  4.  
  5. int dp[MAX][MAX], conserto[MAX], venda[MAX];
  6. int n, m, p, ini;
  7. int solve(int pos, int idade){ // dp para saber o menor caminho
  8.     if(pos == n) return dp[pos][idade] = 0;
  9.  
  10.     if(dp[pos][idade] != -1) return dp[pos][idade];
  11.  
  12.     int f_way = solve(pos+1, 1) + p-venda[idade] + conserto[0];
  13.     if(idade == m) return dp[pos][idade] = f_way;
  14.  
  15.     int s_way = solve(pos+1, idade+1) + conserto[idade];
  16.     return dp[pos][idade] = min(f_way, s_way);
  17. }
  18.  
  19. void min_way(){ // percorre a dp para achar as melhores voltas feitas
  20.     vector<int> ans;
  21.     memset(dp[n], 0, sizeof dp[n]);
  22.     int idade = ini;
  23.     for(int i = 0; i < n; i++){
  24.         if(idade == m){
  25.             ans.push_back(i+1);
  26.             idade = 1;
  27.         }else{
  28.             int f_way = dp[i+1][1] + p - venda[idade] + conserto[0];
  29.             int s_way = dp[i+1][idade + 1] + conserto[idade];
  30.             if(f_way <= s_way){
  31.                 ans.push_back(i+1);
  32.                 idade = 1;
  33.             }else idade++;
  34.         }
  35.     }
  36.  
  37.     if(!ans.size()) cout << 0 << endl;
  38.     else{
  39.         for(int i = 0; i < ans.size(); i++) cout << ans[i] << " \n"[i == ans.size()-1];
  40.     }
  41. }
  42. int main(){
  43.     while(cin >> n >> ini >> m >> p){
  44.         for(int i = 0; i < m; i++) cin >> conserto[i];
  45.         for(int i = 1; i <= m; i++) cin >> venda[i];
  46.         memset(dp, -1, sizeof dp);
  47.         cout << solve(0, ini) << endl;
  48.         min_way();
  49.     }
  50.     return 0;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement