Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.51 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3.  
  4. using namespace std;
  5.  
  6. #define  max_r 100000
  7. long long int right[max_r];
  8. long long int left[max_r];
  9.  
  10. long long int besthub(int R,int L, int X[],long long int B){
  11.   right[0] = X[0];
  12.   left[R-1] = L-X[R-1];
  13.   //Arrayen på index i innehåller den ackumulerade distansen från 0-X[j] för alla j = 0..i
  14.   for(int i = 1; i<R; i++){
  15.     right[i] = right[i-1]+X[i];
  16.   }
  17.   //Array med ackumulerad distans från höger istället
  18.   for(int i = R-2; i>=0; i--){
  19.     left[i] = left[i+1]+(L-X[i]);
  20.   }
  21.  
  22.   /*Det finns alltid en optimal lösning placerad på ett risfält (eftersom vi alltid kan flytta en lösning åt det håll som har flest
  23.   risfält utan att förlora något på det*/
  24.  
  25.   /*
  26.    * Gå igenom varje position på risfältet. Lägg till fler risfält tills du inte kan mer.
  27.    */
  28.   long long int best = 0;
  29.   for(int i = 0; i<R; i++){
  30.     long long int rid = best/2 + best%2;
  31.     long long int lid = best/2;
  32.     while(true){
  33.       long long int ri = right[i+rid]-right[i]-(rid*X[i]); //kostnaden för middle risfält till höger
  34.       long long int le = left[i-lid]-left[i]-(lid*(L-X[i])); //kostnaden för middle risfält till vänster
  35.       long long int bp = le+ri; //summan
  36.       if(bp <= B && i+rid < R-1 && i-lid >= 0){
  37.     if(rid < lid) rid++;
  38.     else lid++;
  39.       } else {
  40.     break;
  41.       }
  42.     }
  43.     if((rid + lid) > best) best = rid+lid;
  44.   }
  45.   return best;
  46. }
  47.  
  48. int main(){
  49.   int x[] = {2,6,8,10,12,16,29};
  50.   printf("%lld\n", besthub(7, 40, x, 20));
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement