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 ", ans ); } return 0; }