HDU 6127: Hard challenge

本文介绍了一种基于点比率的排序算法实现,并通过C++代码示例详细解释了该算法的具体应用过程。算法首先定义了一个包含坐标和权重的点结构体,接着利用点比率进行比较并排序。该算法特别关注坐标为负数或横纵比小于等于0的点,并通过两组累加求和的方式计算最大乘积结果。

Hard challenge

 

#include<bits/stdc++.h>
typedef long long L;
using namespace std;
#define endl '\n'
const int MAXN=5*1e4+5;
struct Point
{
int x,y,val;
}p[MAXN];
bool cmp(const Point &x,const Point &y)
{
if(x.x==0)return true;
if(y.x==0)return false;
return x.y/(double)x.x>=y.y/(double)y.x;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>p[i].x>>p[i].y>>p[i].val;
sort(p,p+n,cmp);
L sum1=0,sum2=0,ans=0;
for(int i=0;i<n;i++)
{
if(p[i].x<0||(p[i].x==0&&p[i].y<0))sum1+=p[i].val;
else sum2+=p[i].val;
}
for(int i=0;i<n;i++)
{
if(p[i].x<0||(p[i].x==0&&p[i].y<0))
{
sum1-=p[i].val;
sum2+=p[i].val;
}
else
{
sum1+=p[i].val;
sum2-=p[i].val;
}
ans=max(ans,sum1*sum2);
}
cout<<ans<<endl;
}
return 0;

转载于:https://www.cnblogs.com/zjnu/p/7367393.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值