hihocoder-1812-圆的最大权值
#1812 : 圆的最大权值
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
平面上有N个点,其中第i个点的坐标是(Xi, Yi),并且具有权值Wi。
现在你可以以原点为圆心,任意非负实数半径画一个圆。我们将圆内和圆上所有点的权值和记作这个圆的权值。
请你计算如何画圆可以使权值最大,并输出最大的权值。
输入
第一行包含一个整数N。
以下N行每行三个整数Xi,Yi和Wi。
1 <= N <= 100000
0 <= Xi, Yi <= 1000000
-1000000 <= Wi <= 1000000
输出
一个整数表示答案
-
样例输入
-
3 0 1 1 1 0 1 1 1 -1
样例输出
-
2
题解:
很简单的题目,对所有的点进行排序,然后遍历一遍就可以求出最优大小的
注意的是在原点的点,必须被这个圆给圈住。
#include <cstdio>
#include <cstdlib>
const int MAXN = 100000 + 10;
struct Node
{
long long d, w;
};
Node nd[MAXN];
int cmp(const void *a, const void *b)
{
Node *aa = (Node *)a;
Node *bb = (Node *)b;
if(aa->d > bb->d)
{
return 1;
}else{
return -1;
}
}
int main(){
int num;
while(scanf("%d", &num) != EOF)
{
int x, y, w;
for(int i=0; i<num; ++i)
{
scanf("%d %d %d", &x, &y, &w);
nd[i].d = 1LL*x*x + 1LL*y*y;
nd[i].w = (long long)(w);
}
qsort(nd, num, sizeof(Node), cmp);
long long ans = 0, tmp=0;
int j = 0;
if(nd[j].d == 0LL)
{
while(j<num && nd[j].d == 0LL)
{
ans += nd[j].w;
++j;
}
tmp = ans;
}
for(int i=j; i<num; ++i)
{
tmp += nd[i].w;
if(tmp > ans)
{
ans = tmp;
}
}
printf("%lld\n", ans );
}
return 0;
}