亞馬遜 在線測試題目 amazon


 

 

 

 

分析:其實就是求矩形中某一個點到其他點的距離加權最小

 

方法一:

對每一個點求其到其他點的加權距離,然后比較最小。由於有M*N個點,對每一個點求加權距離是O(M*N)的,所以整體時間復雜度是O(M*M*N*N)的。

方法二:

首先做預處理,計算每一行有多少個點,每一列有多少個點,然后計算把其他行的點挪到我這一行需要的加權距離,把其他列的點挪到我這一列的加權距離,

然后對每一個點,計算挪到其所在行的代價+所在列的代價和,求出最小。時間復雜度O(M*N)。

 

 

code見下面,calcMIN是方法一,calcDiego是方法二。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define MAX_SIZE 500

int arr[MAX_SIZE][MAX_SIZE];
int sumOfRow[MAX_SIZE];
int sumOfCol[MAX_SIZE];
int costOfRow[MAX_SIZE];
int costOfCol[MAX_SIZE];

int rtnRow;
int rtnCol;

int calcCost(int row, int col, int x, int y)
{
    int cost = 0;
    for(int i = 0; i < row; i++)
    {
        for(int j = 0; j < col; j++)
        {
            if(arr[i][j] != 0)
            {
                cost += (abs(x-i) + abs(y-j)) * arr[i][j];
            }
        }
    }
    return cost;
}

void calcMin(int row, int col)
{
    long long minCost = LLONG_MAX;
    long long tmpCost = 0;
    for(int i = 0; i < row; i++)
    {
        for(int j = 0; j < col; j++)
        {
            tmpCost = calcCost(row, col, i, j);
            if(tmpCost < minCost)
            {
                minCost = tmpCost;
                rtnRow = i;
                rtnCol = j;
            }
        }
    }
}



void calcDiego(int row, int col)
{
    for(int i = 0; i < row; i ++)
    {
        sumOfRow[i] = 0;
        costOfRow[MAX_SIZE] = 0;
    }

    for(int j = 0; j < col; j++)
    {
        sumOfCol[j] = 0;
        costOfCol[MAX_SIZE] = 0;
    }

    for(int i = 0; i < row; i ++)
    {
        for(int j = 0; j < col; j++)
        {
            sumOfRow[i] += arr[i][j];
            sumOfCol[j] += arr[i][j];
        }
    }


    for(int i = 0; i < row; i ++)//cost for moving row j to row i
    {
        for(int j = 0; j < row; j ++)
        {
            if(i == j || sumOfRow[j] == 0)
                continue;
            costOfRow[i] += (abs(j-i)) * sumOfRow[j];
        }
    }

    for(int i = 0; i < col; i ++)//cost for moving col j to col i
    {
        for(int j = 0; j < col; j ++)
        {
            if(i == j || sumOfCol[j] == 0)
                continue;
            costOfCol[i] += (abs(j-i)) * sumOfCol[j];
        }
    }

    int cost = INT_MAX;
    for(int i = 0; i < row; i ++)
    {
        for(int j = 0; j < col; j ++)
        {
            if(costOfRow[i] + costOfCol[j] < cost)
            {
                cost = (costOfRow[i] + costOfCol[j] );
                rtnRow = i;
                rtnCol = j;
            }
        }
    }

}


int main()
{
    int i, j;
    int row, col;
    cout << "INT_MAX\t" << INT_MAX << endl;
    cout << (500ULL*500*500000) << endl;
    while (scanf("%d%d", &row, &col) == 2) {
        for (i = 0; i < row; i++)
        {
            for (j = 0; j < col; j++)
            {
                scanf("%d", &arr[i][j]);
            }
        }
        //printf("calc\n " );
        calcMin(row, col);
        printf("%d %d\n", rtnRow, rtnCol);
        calcDiego(row, col);
        printf("%d %d\n", rtnRow, rtnCol);

    }

    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM