HDU6127 Hard challenge 极角排序|暴力

52 篇文章 0 订阅
29 篇文章 0 订阅

题目链接:HDU6127

题目大意:给你n个点,坐标X,Y,权值val,要求用一条过原点的直线将这些点分成左右两部分,任意两点的权值等于两点的权值乘积,问最大可划分出来的权值为?

题目思路:将所有点按照斜率排序,然后扫一圈即可,说着可能有点抽象,动手画一下图就明白了。每条直线左右点的权值=左边点权值和*右边点权值和。

代码参考:大佬的 代码


AC代码:

/*
HDU6127
2017年8月16日09:59:39
极角排序,暴力求解
AC 
*/
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#define PI (acos(-1.0))
using namespace std;
typedef long long ll;
const int maxn=5e4+50;
const double eps=1e-8;

int dcmp(double x){
	if(fabs(x)<eps) return 0;
	return x>0 ? 1 : -1;
}

struct node{
	int x,y,val;
	double theta;
	bool operator <(const node& b)const{
		return theta<b.theta;
	}
}a[maxn];

int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			//scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].val);
			scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].val);
			if(a[i].x==0) a[i].theta=PI/2.0;//在Y轴上的点
			else a[i].theta=atan(1.0*a[i].y/(1.0*a[i].x)); 
			
		} 
		sort(a+1,a+1+n);
		ll rsum=0,lsum=0;
		for(int i=1;i<=n;i++){
			if(a[i].x>0) rsum+=a[i].val;
			else lsum+=a[i].val;
		}
		ll ans=lsum*rsum;
		for(int i=1;i<=n;i++){
			if(a[i].x>=0){
				lsum+=a[i].val;
				rsum-=a[i].val;
			}
			else{
				lsum-=a[i].val;
				rsum+=a[i].val;
			}
			ans=max(ans,lsum*rsum);
		}
		printf("%lld\n",ans);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值