1. 程式人生 > >Flowerpot(又是尺取。。)

Flowerpot(又是尺取。。)

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()
{
    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

Flowerpot(又是尺取。。)