Building Blocks (Hdu 5191)

Source: Internet
Author: User

Building BlocksTime limit:2000/1000 MS (java/others) Memory limit:65536/65536 K (java/others)
Total submission (s): 281 Accepted Submission (s): 59


Problem Descriptionafter enjoying the Movie,lele went home alone. LeLe decided to build blocks.
LeLe has already built n Piles. He wants to move some blocks to make W Consecutive piles with exactly the same height H .

LeLe already put all of him blocks in these piles, which means he can not add any blocks into them. Besides, he can move a block from one pile to another or a new one,but not the position betweens both piles already exists. For Instance,after one Move, "3 2 3" can become "2 2 4" or "3 2 2 1", and not "3 1 1 3".

You is request to calculate the minimum blocks should LeLe move.
Inputthere is multiple test cases, about - Cases.

The first line of input contains three integers N,W ,H (1≤N,W ,H ≤50000) . n Indicate n Piles blocks.

For the next line, there is n Integers A 1 , A 2 , A 3 ,... ..... .., A n Indicate the height of each piles. (1≤A i ≤ 50000 )

The height of a block is 1.
Outputoutput the minimum number of blocks should LeLe move.

If There is no solution, output "1" (without quotes).
Sample Input
4 3 21 2 3 54 4 41 2 3 4

Sample Output
1-1Hintin first case, LeLe move one block from third pile to first pile.

Sourcebestcoder Round #34
Recommendhujie | We have carefully selected several similar problems for you:5193 5192 5189 5188 5185


Test instructions: There are n heaps of bricks piled up by 1*1 small wooden blocks, now you have to move several times so that the continuous length of the height of W is h, can only move one at a time, and can be added on both sides of the new heap (only on both sides, cannot be inserted in the middle), ask at least how many times to move.

Idea: Because the heap can be added on both sides, so I first on each side of the array with W length, move array in each place into H to move in or move out of the number of steps, a array of records I is to move in or move out. Then maintain a continuous interval of W (i-w+1 ~ i), calculate the total number of moves in this interval z and the number of moves out and F, so that the interval to meet the conditions will be moved M=z+f-min (z,f), (here minus min (Z, f) is because the move in and out can offset a portion). The match with the g++, the result of the final sentence timeout hung! Later in C + + turn over!!!

Code:

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include < cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set > #include <queue> #pragma comment (linker, "/stack:102400000,102400000") #define MAXN 150010#define MAXN 2005# Define mod 1000000009#define INF 0x3f3f3f3f#define pi ACOs ( -1.0) #define EPS 1e-6#define Lson rt<<1,l,mid#define RSO  N rt<<1|1,mid+1,r#define FRE (i,a,b) for (i = A, I <= b; i++) #define FREE (i,a,b) for (i = A; I >= b; i--) #define FRL (i,a,b) for (i = A; I < b; i++) #define FRLL (i,a,b) for (i = A; i > b; i--) #define MEM (T, v) memset ((t), V, si Zeof (t)) #define SF (n) scanf ("%d", &n) #define SFF (A, b) scanf ("%d%d", &a, &b) #define SFFF (a,b,c) scanf ("%d%d%d", &a, &b, &c) #define PF printf#define DBG pf ("hi\n") typedef long Long ll;using Nam Espace std;ll n,w,h;ll Move[maxn];bool a[maxn];intMain () {ll i,j,x;        while (~SCANF ("%lld%lld%lld", &n,&w,&h)) {ll sum=0,m;        FRL (i,0,n+2*w) A[i]=false;            FRE (i,w+1,n+w) {scanf ("%lld", &x);            Move[i]=abs (h-x);            if (h<x) a[i]=true;        Sum+=x;            } if (w*h>sum) {pf (" -1\n");        Continue        } ll Z=0,f=0;        FRE (I,1,W)//before and after the expansion of move[i]=h;        FRE (i,n+w+1,n+2*w) move[i]=h;        Z=w*h;        f=0;        M=z+f-min (Z,F);        ll Ans=m;            FRE (I,W+1,N+2*W)///enumeration interval {if (a[i-w])//To remove the first number of the previous interval (move it back) f-=move[i-w];            else z-=move[i-w];            if (A[i])//plus new incoming f+=move[i];            else Z+=move[i];            M=z+f-min (Z,F);        Ans=min (ANS,M);    } PF ("%lld\n", ans); } return 0;}


Building Blocks (Hdu 5191)

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.