Advertisement
Guest User

USACO March 2013 - GOLD

a guest
Mar 12th, 2013
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.99 KB | None | 0 0
  1. //tonynater - USACO 2013
  2.  
  3. #include <algorithm>
  4. #include <bitset>
  5. #include <cassert>
  6. #include <cmath>
  7. #include <ctime>
  8. #include <fstream>
  9. #include <iomanip>
  10. #include <iostream>
  11. #include <list>
  12. #include <map>
  13. #include <queue>
  14. #include <set>
  15. #include <sstream>
  16. #include <stack>
  17. #include <string>
  18. #include <vector>
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22.  
  23. using namespace std;
  24.  
  25. #define sz(x) ((int) x.size())
  26.  
  27. typedef long double ld;
  28. typedef long long ll;
  29. typedef pair<int, int> pii;
  30.  
  31. const double pi = 3.141592653589793;
  32. const double tau = 6.283185307179586;
  33. const double epsilon = 1e-6;
  34.  
  35. const int MAX_N = 1100;
  36.  
  37. int N;
  38.  
  39. ll cows[MAX_N];
  40.  
  41. int low = 0, high = 0;
  42. ll dp[MAX_N][MAX_N][2];
  43. ll minDamage(int l, int h, bool lh)
  44. {
  45.     if(dp[l][h][lh] != -1) return dp[l][h][lh];
  46.    
  47.     if(l+h == N) return (dp[l][h][lh] = 0);
  48.    
  49.     ll damage = 1LL<<60;
  50.     if(!lh) //lower
  51.     {
  52.         if(l < low) damage = min((cows[low-l]-cows[low-l-1])*(N-l-h) + minDamage(l+1,h,0), damage);
  53.         if(h < high) damage = min((cows[low+h]-cows[low-l])*(N-l-h) + minDamage(l,h+1,1), damage);
  54.     }else //higher
  55.     {
  56.         if(l < low) damage = min((cows[low+h-1]-cows[low-l-1])*(N-l-h) + minDamage(l+1,h,0), damage);
  57.         if(h < high) damage = min((cows[low+h]-cows[low+h-1])*(N-l-h) + minDamage(l,h+1,1), damage);
  58.     }
  59.    
  60.     return (dp[l][h][lh] = damage);
  61. }
  62.  
  63. int main (int argc, const char * argv[])
  64. {
  65.     freopen("cowrun.in", "r", stdin); freopen("cowrun.out", "w", stdout);
  66.    
  67.     cin >> N;
  68.    
  69.     for(int i = 0; i < N; i++)
  70.     {
  71.         cin >> cows[i];
  72.         if(cows[i] < 0) ++low;
  73.         else ++high;
  74.     }
  75.    
  76.     sort(cows, cows+N);
  77.    
  78.     fill_n(&dp[0][0][0], MAX_N*MAX_N*2, -1);
  79.    
  80.     ll damage = 1LL<<60;
  81.     if(low > 0) damage = min(-cows[low-1]*N + minDamage(1,0,0), damage); //lower
  82.     if(high > 0) damage = min(cows[low]*N + minDamage(0,1,1), damage); //higher
  83.    
  84.     cout << damage << '\n';
  85.    
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement