• 2020 Multi-University Training Contest 1-1009 Leading Robots


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

     

     题意:给定一些车的初始位置和加速度(初速度为0

      问某一时刻的领先车有多少种情况

    分析:

      初始位置最大的一定会在一开始领先

      初始位置小的(或相同)且 加速度小的 没有机会成为领先

    思路:

      机器人先按加速度 a 排序,加速度相同按初始位置 p 排序。

      按加速度遍历机器人,记录和比较超越时间,维护一个顺序栈得到领先的车

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<bitset>
    #include<cassert>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<ctime>
    #include<deque>
    #include<iomanip>
    #include<list>
    #include<map>
    #include<queue>
    #include<set>
    #include<stack>
    #include<vector>
    #include <vector>
    #include <iterator>
    #include <utility>
    #include <sstream>
    #include <limits>
    #include <numeric>
    #include <functional>
    using namespace std;
    #define gc getchar()
    #define mem(a) memset(a,0,sizeof(a))
    //#define sort(a,n,int) sort(a,a+n,less<int>())
    
    #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    typedef pair<int,int> pii;
    typedef char ch;
    typedef double db;
    
    const double PI=acos(-1.0);
    const double eps=1e-6;
    const int inf=0x3f3f3f3f;
    const int maxn=1e5+10;
    const int maxm=100+10;
    const int N=2e5+10;
    const int mod=1e9+7;
    
    int stack_r[N];
    struct point{
        ll x , y , num;
    }s[N] , g[N];
    
    bool cmp(point a , point b){
        if(a.x == b.x)
            return a.y > b.y;
        return a.x < b.x;
    }
    
    int main(){
        int T;
        cin >> T;
        
        ll ans = 0 , n = 0;
        while(T--)
    	{
    		ans = 0;
    		cin >> n;
            for(int i = 1;i <= n;i++)
    		{
                cin >> s[i].x >> s[i].y;
            }
            sort(s+1 , s+1+n , cmp);
            
            int max_s = 0;
    		int p = 0;
            for(int i = n;i >= 1;i--)
    		{
                int j = i;
                while(j >= 2 && s[j-1].x == s[i].x)
                {
    				j--;
                }
    			if(s[j].y > max_s)
    			{
    				p += 1;
                    if(i == j)
    				{
    					g[p] = {s[j].y , -s[j].x , 1};
    					max_s = s[j].y;
    				}
    				else if(s[j].y == s[j+1].y)
    				{
                        g[p] = {s[j].y , -s[j].x , 0};
                    }
    				else
    				{
                        g[p] = {s[j].y , -s[j].x , 1};
    					max_s = s[j].y;
                    }
                }
                i = j;
            }
            
            int t = 0;
            for(int i = 1;i <= p;i++)
    		{
                while(t >= 2)
    			{
    				int s1 = (g[i].y - g[stack_r[t]].y) * (g[stack_r[t]].x - g[stack_r[t-1]].x);
    				int s2 = (g[stack_r[t]].y - g[stack_r[t-1]].y) * (g[i].x - g[stack_r[t]].x);
    			 	if(s1 >= s2)
    			 	{
                     	t -= 1;
                	}
                }
                t += 1; 
                stack_r[t] = i;
            }
            for(int i = 1;i <= t;i++)
            {
                ans += g[stack_r[i]].num;
     		}
    		cout << ans <<endl;
        }
        return 0;
    }
    

      

      

    作者:YukiRinLL

    出处:YukiRinLL的博客--https://www.cnblogs.com/SutsuharaYuki/

    您的支持是对博主最大的鼓励,感谢您的认真阅读。

    本文版权归作者所有,欢迎转载,但请保留该声明。

  • 相关阅读:
    UIWebView显示乱码问题
    Masonry控制台打印约束冲突问题解决
    iOS正则表达式之验证问题总结
    Cannot assign to 'self' outside of a method in the init family
    iOS模拟器设置输入中文
    python递归中的return"陷阱"
    自己动手写一个U盘拷贝小工具
    selenium对富文本框的处理
    selenium webdriver如何添加cookie
    利用ChromeOptions()加载用户配置
  • 原文地址:https://www.cnblogs.com/SutsuharaYuki/p/13378208.html
Copyright © 2020-2023  润新知