2018網易內推 堆棋子 規律題

[編程題] 堆棋子

時間限制:1秒node

空間限制:32768Kios

小易將n個棋子擺放在一張無限大的棋盤上。第i個棋子放在第x[i]行y[i]列。同一個格子容許放置多個棋子。每一次操做小易能夠把一個棋子拿起並將其移動到原格子的上、下、左、右的任意一個格子中。小易想知道要讓棋盤上出現有一個格子中至少有i(1 ≤ i ≤ n)個棋子所須要的最少操做次數.

輸入描述:
輸入包括三行,第一行一個整數n(1 ≤ n ≤ 50),表示棋子的個數
第二行爲n個棋子的橫座標x[i](1 ≤ x[i] ≤ 10^9)
第三行爲n個棋子的縱座標y[i](1 ≤ y[i] ≤ 10^9)


輸出描述:
輸出n個整數,第i個表示棋盤上有一個格子至少有i個棋子所須要的操做數,以空格分割。行末無空格

如樣例所示:
對於1個棋子: 不須要操做
對於2個棋子: 將前兩個棋子放在(1, 1)中
對於3個棋子: 將前三個棋子放在(2, 1)中
對於4個棋子: 將全部棋子都放在(3, 1)中

輸入例子1:
4
1 2 4 9
1 1 1 1

輸出例子1:
0 1 3 10

這個題一開始我覺得是轉化成圖的題而後DP作。當時作的時候鬱悶了好久。
一開始覺得是在全部棋子中直接暴力,後來暴力作題只過了50%的樣例。
以後看題解,x,y軸是兩個獨立的啊!!!
而後枚舉全部可能的棋子出現位置,對全部棋子進行暴力最大也就是50*2500的複雜度,徹底沒問題的啊
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
struct node {
    int x,y;
}qz[55],qztmp[55*55];

int dis[55*55][55];
int ans[55*55][55];
int x[55];
int y[55];
int main()
{
    int n;
    while(~scanf("%d",&n)){
        int i,j;
        memset(dis,0,sizeof(dis));
        for(i = 0;i < n;i++){
            cin>>qz[i].x;
            x[i] = qz[i].x;
        }
        for(i = 0;i < n;i++){
            cin>>qz[i].y;
            y[i] = qz[i].y;
        }
        int cnt = 0;
        for(i = 0;i < n;i++){
            for(j = 0;j < n;j++){
                qztmp[cnt].x = x[i];
                qztmp[cnt++].y = y[j];
            }
        }
        for(i = 0;i < cnt;i++){
            for(j =0; j < n;j++)
                dis[i][j] = abs(qztmp[i].x-qz[j].x)+abs(qztmp[i].y-qz[j].y);
        }
        memset(ans,0,sizeof(ans));
        for(i = 0;i < cnt;i++){
            sort(dis[i],dis[i]+n);
            for(j = 0;j < n;j++){
                int k;
                for(k = 0;k < j+1;k++){
                    ans[i][j] += dis[i][k];
                }
            }
        }
        int res;
        for(i = 0; i < n;i++){
            res = ans[0][i];
            for(j = 0;j < cnt;j++){
                res = min(ans[j][i],res);
            }
            cout<<res;
            if(i < n-1)
                cout << " ";
            else
                cout<<endl;

        }
    }

    return 0;
}
View Code
相關文章
相關標籤/搜索