天天看點

Coming Back 2題目描述輸入輸出樣例輸入樣例輸出

題目描述

在一個街區中,住着n個你的小夥伴,他們的位址用整點pi=(xi,yi)來表示(0<=xi<=100,0<=yi<=100,pi=pj iff i=j),其中每個小夥伴被賦予一個正整數權值Wi,以表示你們的友好程度。這時候問題又就來了,你要在這條街上尋找一個位置(這裡特别說明,該位置可以是街區中任意一個位置,不必是其中某個小夥伴的住處)居住一段時間,你希望這個位置能夠最大程度友善與各個小夥伴交流,同時又要考慮到與不同小夥伴的要好程度。

為了簡單起見,我們認為你的要求等價于到n個小夥伴那裡的距離與權值的乘積和最小(ie. argmin_{p} sigma Wi*|p-pi|,其中定義|.|為曼哈頓距離,即|(m,n)-(a,b)|=|m-a|+|n-b|,可以看出這個距離也與在街區中的需要走的路程相一緻)。

輸入

多組測試資料。

每組測試資料的第一行為正整數n,表示有n隻小夥伴;

接下來有n行,每行有3個正整數,分别表示第i個小夥伴的位址坐标xi,yi(0<=xi<=100,0<=yi<=100)和你們的友好程度Wi(Wi很小,你無須擔心,保證sigma Wi在int範圍内)。

輸出

對于每組資料,輸出一行,包含2個整數,即你標明的将要居住的位置坐标(x,y)(如果有多個選擇,則輸出最左上的位置)。

樣例輸入

1 2 2

2 4 1

3 3 4

樣例輸出

3 3

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 150

struct point
{
    int x, y;
    int num;
};

bool cmpx(point a, point b)
{
    return a.x < b.x;
}

bool cmpy(point a, point b)
{
    return a.y < b.y;
}

point p[MAXN];
int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        int number = 0;
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d%d", &p[i].x, &p[i].y, &p[i].num);
            number += p[i].num;
        }
        number = (number+1) / 2;
        sort(p, p+n, cmpx);
        int numx = number;
        int j = 0;
        while(numx > 0)
        {
            numx -= p[j].x;
            j++;
        }
        printf("%d", p[j-1].x);
        sort(p, p+n, cmpy);
        int numy = number;
        j = 0;
        while(numy > 0)
        {
            numy -= p[j].y;
            j++;
        }
        printf(" %d\n", p[j-1].y);
    }
}
           

繼續閱讀