1. 程式人生 > >Find the hotel HDU - 3193(RMQ)

Find the hotel HDU - 3193(RMQ)

第一次 距離 printf pac 如果 open syn 滿足 %d

題意:

有n個旅館,從這n個旅館中找出若幹個旅館,使得這若幹個旅館滿足這樣的條件:不能從其它和剩下的旅館中找到一個價格和距離都小於這個旅館的旅館。。。

解析:

 按price 排序,若price相同, 則按距離排序

 然後遍歷每一個旅館,在處理當前 旅館時,二分在price小於當前旅館price的旅館中 找到最後一個price小於當前旅館price的旅館(因為可能price相同)

 然後rmq求距離最小值就可

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include 
<map> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cmath> #define rap(i, a, n) for(int i=a; i<=n; i++) #define rep(i, a, n) for(int i=a; i<n; i++) #define lap(i, a, n) for(int i=n; i>=a; i--) #define
lep(i, a, n) for(int i=n; i>a; i--) #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) //freopen("1.txt", "r", stdin); using namespace std; const int maxn = 10010
, INF = 0x7fffffff; int d[maxn][20]; int n; struct node { int price, dis; }Node[maxn]; bool cmp(node a, node b) { if(a.price == b.price) return a.dis < b.dis; return a.price < b.price; } int rmq(int l, int r) { int k = 0; while((1<<(k+1)) <= r-l+1) k++; return min(d[l][k], d[r-(1<<k)+1][k]); } int main() { while(~scanf("%d", &n)) { vector<node> v; rep(i, 0, n) { scanf("%d%d", &Node[i].price, &Node[i].dis); } sort(Node, Node+n, cmp); rap(i, 0, n) d[i][0] = Node[i].dis; for(int j=1; (1<<j) <= n; j++) for(int i=0; i+(1<<j)-1 < n; i++) d[i][j] = min(d[i][j-1], d[i+(1<<(j-1))][j-1]); v.push_back(Node[0]); for(int i=1; i<n; i++) { int x = 0, y = i; //lower_bound實現 返回第一次出現當前price的位置 while(x < y) { int mid = x + (y-x) / 2; if(Node[mid].price >= Node[i].price) y = mid; else x = mid + 1; } if(x == 0)// 如果當前price就是最小的 { v.push_back(Node[i]); continue; } int h = rmq(0, x-1); //查詢0到x-1中是否存在一個dis小於當前dis if(h >= Node[i].dis) //如果不存在 v.push_back(Node[i]); } printf("%d\n", v.size()); for(int i=0; i<v.size(); i++) printf("%d %d\n", v[i].price, v[i].dis); } return 0; }

Find the hotel HDU - 3193(RMQ)