zoukankan      html  css  js  c++  java
  • 2017ACM暑期多校联合训练

    题目链接

    Problem Description
    There are n points on the plane, and the ith points has a value vali, and its coordinate is (xi,yi). It is guaranteed that no two points have the same coordinate, and no two points makes the line which passes them also passes the origin point. For every two points, there is a segment connecting them, and the segment has a value which equals the product of the values of the two points. Now HazelFan want to draw a line throgh the origin point but not through any given points, and he define the score is the sum of the values of all segments that the line crosses. Please tell him the maximum score.

    Input
    The first line contains a positive integer T(1≤T≤5), denoting the number of test cases.
    For each test case:
    The first line contains a positive integer n(1≤n≤5×104).
    The next n lines, the ith line contains three integers xi,yi,vali(|xi|,|yi|≤109,1≤vali≤104).

    Output
    For each test case:
    A single line contains a nonnegative integer, denoting the answer.

    Sample Input
    2
    2
    1 1 1
    1 -1 1
    3
    1 1 1
    1 -1 10
    -1 0 100

    Sample Output
    1
    1100

    题目描述:

    平面上有(n)个点,已知每个点的坐标为((x,y)),以及改点的权值为(val),任意两点之间可以连接成一条不经过原点的边,该边的权值是两个端点的权值的乘积。现在要求画一条经过原点的直线,定义这条直线的权值为这条直线穿过的所有线段的值的和,问权值的最大值。

    分析:

    对于一条经过原点的直线,一定是把这(n)个点分为了左右两部分,只有连接左右两侧的线段才会对答案有贡献,又因为任意两点之间都有连线,整理后最后的权值就是直线一侧的点的和与另一侧点的和的乘积。现在问题就转化为找到一个最优的划分,使得两侧和的乘积最大。

    将n个点按与原点的极角排序,只考虑(180)度的范围,因此按正切值从负无穷到正无穷排序。初始时分界线为(y)轴,横坐标小于(0)的为一部分,横坐标大于(0)的为另一部分,初始答案为这两部分的乘积。按排好的序依次处理每个点,相当于这条分界线在按逆时针转动,如果遇到一个横坐标为正的点,就把它扔到左侧,如果遇到横坐标为负的点,就扔到右侧,每次更新答案,遍历一遍后得到最大得分。

    代码:

    #include<cmath>
    #include<cstdio>
    #include<algorithm>
    typedef long long ll;
    using namespace std;
    #define eps 1e-9
    #define maxn 200005
    struct Node
    {
        double x,y,ang;///横纵坐标,极角
        int v;///权值
    } p[maxn];
    
    bool cmp(Node a,Node b)///结构体按照极角从小到大排序
    {
        return a.ang<b.ang;
    }
    int n,T;
    ll sumL,sumR,ans;
    void work()
    {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            scanf("%lf%lf%d",&p[i].x,&p[i].y,&p[i].v);
            p[i].ang=atan(p[i].y/p[i].x);
        }
        sort(p+1,p+n+1,cmp);
        sumL=sumR=ans=0;
        for(int i=1; i<=n; i++)
            if (p[i].x>eps)sumL+=p[i].v;
            else sumR+=p[i].v;
        ans=sumL*sumR;
        for(int i=1; i<=n; i++)
        {
            if (p[i].x>0)sumL-=p[i].v,sumR+=p[i].v;
            else sumL+=p[i].v,sumR-=p[i].v;
            ans=max(ans,sumL*sumR);
        }
        printf("%lld
    ",ans);
    }
    int main()
    {
        scanf("%d",&T);
        while (T--)
            work();
        return 0;
    }
    
  • 相关阅读:
    sql server 索引总结一
    公用表表达式(CTE)
    解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题
    python测试开发django-2.templates模板与html页
    python测试开发django-1.开始hello world!
    pytest文档28-重复执行用例(pytest-repeat)
    pytest文档27-pytest分布式执行(pytest-xdist)
    pytest文档26-运行上次失败用例(--lf 和 --ff)
    pytest文档25-conftest.py作用范围
    python接口自动化11-post传data参数案例
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7371383.html
Copyright © 2011-2022 走看看