リンク:
https://vjudge.net/problem/LightOJ-1349
質問の意味:
最後に、アラジンは、偉大な魔法のランプで、家に達しました。彼はこれまで以上に幸せでした。彼は素敵な男の子だったので、彼は町のすべての人々と幸福を共有したいと思いました。だから、彼は、彼らが簡単にそこに会うことができるように、いくつかの場所で町のすべての人々を招待したかったです。アラジンは本当に裕福になったようなので、人々の数は問題ではありませんでした。ここでは、同様の問題を与えています。
町はMXN 2Dグリッドとしてモデル化できると仮定します。人々は、細胞に住んでいます。アラジンは、すべての人々が最適な全体的なコストとここに集まることができるように、セルを選択したいです。ここでは、人のためのコストは、彼が選択したセルに到達するために移動しなければならない距離です。人の細胞での生活(x、y)と、彼はセル(P、Q)に行きたい場合は、コストがある| XP | + | YQ |。だから、(5、2)と(1、3)との間の距離であり、| 5-1 | + | 2-3 | これは5です。そして、全体的なコストは、すべての人々のための費用の合計です。
だから、あなたは、町や人々の情報、収集ポイントとしてアラジンで選択する必要があり、全体的なコストはできるだけ低いようであるべきセルを報告するために、あなたのタスクを与えられています。
アイデア:
中間点の二次元座標を直接メジアン採取、又は暴力計算費用は、各位置の最小値を算出します。
コード:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<math.h>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
const int INF = 1e9;
const int MAXN = 5e4+10;
const int MOD = 1e9+7;
struct Node
{
int p, n;
bool operator < (const Node &rhs) const
{
return this->p < rhs.p;
}
}nodex[MAXN], nodey[MAXN];
int Numx[MAXN], Numy[MAXN];
int n, m, q;
int Cal(int num, int Num[], int bor)
{
int tmp = 0;
for (int i = 1;i <= bor;i++)
{
tmp += Num[i];
if (tmp >= (num+1)/2)
return i;
}
return 0;
}
int main()
{
int t, cnt = 0;
scanf("%d", &t);
while(t--)
{
printf("Case %d:", ++cnt);
memset(Numx, 0, sizeof(Numx));
memset(Numy, 0, sizeof(Numy));
scanf("%d%d%d", &n, &m, &q);
int sum = 0;
int u, v, w;
for (int i = 1;i <= q;i++)
{
scanf("%d%d%d", &u, &v, &w);
nodex[i].p = u, nodex[i].n = w;
nodey[i].p = v, nodey[i].n = w;
Numx[u] += w;
Numy[v] += w;
sum += w;
}
sort(nodex+1, nodex+1+q);
sort(nodey+1, nodey+1+q);
int rx = Cal(sum, Numx, n);
int ry = Cal(sum, Numy, m);
printf(" %d %d\n", rx, ry);
}
return 0;
}