Flowerpot(又是尺取。。)
阿新 • • 發佈:2018-05-11
get color hid code amp sca sed max hide
題目: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() { intView Coden,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"); } }
Flowerpot(又是尺取。。)