hihocoder-1812-圆的最大权值

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; 
} 

  

原文地址:https://www.cnblogs.com/zhang-yd/p/9900777.html