题目: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 "); } }