Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- #define max_r 100000
- long long int right[max_r];
- long long int left[max_r];
- long long int besthub(int R,int L, int X[],long long int B){
- right[0] = X[0];
- left[R-1] = L-X[R-1];
- //Arrayen på index i innehåller den ackumulerade distansen från 0-X[j] för alla j = 0..i
- for(int i = 1; i<R; i++){
- right[i] = right[i-1]+X[i];
- }
- //Array med ackumulerad distans från höger istället
- for(int i = R-2; i>=0; i--){
- left[i] = left[i+1]+(L-X[i]);
- }
- /*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
- risfält utan att förlora något på det*/
- /*
- * Gå igenom varje position på risfältet. Lägg till fler risfält tills du inte kan mer.
- */
- long long int best = 0;
- for(int i = 0; i<R; i++){
- long long int rid = best/2 + best%2;
- long long int lid = best/2;
- while(true){
- long long int ri = right[i+rid]-right[i]-(rid*X[i]); //kostnaden för middle risfält till höger
- long long int le = left[i-lid]-left[i]-(lid*(L-X[i])); //kostnaden för middle risfält till vänster
- long long int bp = le+ri; //summan
- if(bp <= B && i+rid < R-1 && i-lid >= 0){
- if(rid < lid) rid++;
- else lid++;
- } else {
- break;
- }
- }
- if((rid + lid) > best) best = rid+lid;
- }
- return best;
- }
- int main(){
- int x[] = {2,6,8,10,12,16,29};
- printf("%lld\n", besthub(7, 40, x, 20));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement