zoukankan      html  css  js  c++  java
  • Flowerpot(又是尺取。。)

    题目:http://172.21.85.56/oj/exercise/problem?problem_id=21568

    题目大意:老板需要你帮忙浇花。给出N滴水的坐标,y表示水滴的高度,x表示它下落到x轴的位置。

    每滴水以每秒1个单位长度的速度下落。你需要把花盆放在x轴上的某个位置,使得从被花盆接着的第1滴水开始,到被花盆接着的最后1滴水结束,之间的时间差至少为D。

    我们认为,只要水滴落到x轴上,与花盆的边沿对齐,就认为被接住。给出N滴水的坐标和D的大小,请算出最小的花盆的宽度W

    分析:使用神奇map,map可以对key进行升序排序,如果我们key记录的是水滴的高度的话,我们很快就可以知道这个区间的最大与最小值了,可以用map的value来记录该水滴是否出现过

    当然先个x排个序先

    AC代码:

    #include<stdio.h>
    #include<map>
    #include<math.h>
    #include<algorithm>
    #define MAX 110000
    #define INF 0x3f3f3f3f
    using namespace std;
    struct no
    {
        int x;
        int y;
    }a[MAX];
    bool cmp(no a,no b)
    {
        return a.x<b.x;
    }
    map<int,int>mp;
    int main()
    {
        int n,d,ma,mi,mixx;
        while(scanf("%d%d",&n,&d)!=EOF)
        {
            mp.clear();
            mixx=INF;
            for(int i=0 ; i<n ;i++)
                scanf("%d%d",&a[i].x,&a[i].y);
                sort(a,a+n,cmp);
             int st=0,en=0;
             mp[a[en].y]++;
    
            while(st<=en&&en<n)
             {
                 ma=(--mp.end())->first;
                 mi=(mp.begin())->first;
                 if(ma-mi>=d)
                 {
                     int t=fabs(a[en].x-a[st].x);
                     mixx=min(mixx,t);
                     mp[a[st].y]--;
                     if(mp[a[st].y]==0)
                        mp.erase(a[st].y);
                     st++;
                 }
                 else
                 {
                     en++;
                     mp[a[en].y]++;
                 }
             }
             if(mixx!=INF)
             printf("%d
    ",mixx);
             else
             printf("-1
    ");
        }
    }
    View Code
  • 相关阅读:
    五、nginx 配置实例-负载均衡
    四、nginx配置实例-反向代理
    三、nginx配置文件
    二、Nginx 安装
    十二、rpm包的管理
    十一、进程管理
    十、Linux磁盘分区、挂载
    九、定时任务调度
    八、组管理和权限管理
    七、实用指令
  • 原文地址:https://www.cnblogs.com/shuaihui520/p/9025268.html
Copyright © 2011-2022 走看看