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\n",mixx);
         else
         printf("-1\n");
    }
}
View Code

 

posted @ 2018-05-11 16:14  shuai_hui  阅读(218)  评论(0编辑  收藏  举报