hdu6127-!!多校7&极角排序&问题转化-Hard challenge

.真的要好好思考一下了,这种题根本就不难,或者说,不难在编码水平,而难在问题的转化,高中都学过积角排序qwq。
太菜qwq,给定一些点,他们两两之间都有一条线段,线段的权是他们之间的和。
然后再给你一条直线,如果这条直线经过这些线段,就加上他们的权
问 怎么摆放这条直线,他们的边权最大。
-。-把这些点 用一条直线分成两份,然后求他们的乘积和最大。
这里写图片描述

http://acm.hdu.edu.cn/showproblem.php?pid=6127

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
/*
*/
const double PI=acos(-1.0);
const int maxn=5e4+1000;
struct Node{
     double x,y;
     double jd;
     int  v;
     bool up;
}node[maxn];
bool cmp2(Node a,Node b){
     return a.jd<b.jd;
}
int main()
{   int t;
    int m;
    scanf("%d",&t);
    while(t--){
         ll all_1=0;ll all_2=0;
         scanf("%d",&m);
         for(int i=0;i<m;i++){
         scanf("%lf%lf%d",&node[i].x,&node[i].y,&node[i].v);

           if(!node[i].x) node[i].jd=PI/2.0;
           else node[i].jd=atan(node[i].y/node[i].x);
           if(node[i].x>=0) {node[i].up=true;all_1+=node[i].v;}
           else {node[i].up=false;all_2+=node[i].v;}
           }
         //记录 积角
        long long ans=1ll*all_1*all_2;
        //cout<<ans<<endl;
         sort(node,node+m,cmp2);
         for(int i=0;i<m;i++){
             if(node[i].up){
                all_1-=node[i].v;
                all_2+=node[i].v;
                ans=max(ans,all_1*all_2);
             }
             else
             { all_1+=node[i].v;
               all_2-=node[i].v;
                ans=max(ans,all_1*all_2);
             }
         }
    printf("%lld\n",ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值