zoukankan      html  css  js  c++  java
  • 2020 Multi-University Training Contest 1 1009 Leading Robots

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6759

    题意:给你n个机器人离起跑线的距离p和加速度a,开始起跑后,问你有多少个机器人当过第一名,即在某一时刻,

               其他机器人都在这个机器人的后面,则在此时刻该机器人是第一名,赛道是无限长的。

    思路:所以机器人先按加速度a从大到小排序,加速度相同则按离起跑线的距离p从大到小排序,如果某个机器人的加速度a和距离p都小于或等于另一个机器人,那这个机器人是不可    能排到第一的。然后刚开始的第一名是距离最大的那个机器人,然后再按加速度从小到大遍历机器人,用一个栈存取可能为第一名的机器人,如果栈中的机器人小于2个,就直接加入,否则如果第i个机器人超过栈中第2个机器人的时间小于或等于栈中第一个机器人超过栈中第2个机器人的时间,那栈中第一个机器人也不可能成为第一名,可以直接去掉,然后再把第i个机器人加入栈中即可。由于并列第一不算第一名,所以最后栈中的某个机器人的a和p和另一个机器人的a和p一样的话就要不掉,可以用map记录。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    struct node
    {
        ll p;
        ll a;
    }a[50005],b[50005],c[50005];
    bool cmp(node x,node y)
    {
        if(x.a==y.a)
            return x.p>y.p;
        else
            return x.a>y.a;
    }
    double fun(node x,node y)//返回的是机器人x超过y的时间的平方
    {
        double ans=2*(y.p-x.p);
        ans=ans/(x.a-y.a)*1.0;
        return ans;
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            map<ll,map<ll,ll> >mp;
            int n;
            cin>>n;
            for(int i=1;i<=n;i++)
            {
                cin>>a[i].p>>a[i].a;
                mp[a[i].p][a[i].a]++;
            }
            sort(a+1,a+n+1,cmp);
            int h=1;
            b[h]=a[1];
            ll ma=a[1].p;
            for(int i=2;i<=n;i++)
            {
                if(a[i].p>ma)
                {
                    ma=a[i].p;
                    b[++h]=a[i];
                }
            }
            int k=1;
            c[1]=b[h];
            for(int i=h-1;i>=1;i--)
            {
                if(k<=1)
                {
                    c[++k]=b[i];
                    continue;
                }
                while(k>=2)
                {
                    if(fun(b[i],c[k])<=fun(c[k],c[k-1]))
                        k--;
                    else
                        break;
                }
                c[++k]=b[i];
            }
            int ans=0;
            for(int i=1;i<=k;i++)
            {
                if(mp[c[i].p][c[i].a]==1)
                    ans++;
            }
            cout<<ans<<endl;
        }
    }
    

      

  • 相关阅读:
    2005226考勤登记
    2005219考勤登记
    2005225考勤登记
    2005224考勤登记
    2005222考勤登记
    116道iOS面试题+答案,希望对你的面试有帮助
    在线代码编辑器(Ace)被防火墙误杀
    使用Certbot实现阿里云泛域名证书的自动续期
    实时音视频入门学习:开源工程WebRTC的技术原理和使用浅析
    百善孝为先
  • 原文地址:https://www.cnblogs.com/zcb123456789/p/13357658.html
Copyright © 2011-2022 走看看