程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu - 4268 - Alice and Bob

hdu - 4268 - Alice and Bob

編輯:C++入門知識

題意:Alice和Bob都有N個矩形,問Alice的矩形最多能覆蓋Bob的矩形多少個。每個矩形只能用一次,寬與高不能旋轉。   ——>>貪心,剛開始想到的策略是:將矩形按寬與高從大到小排序,然後Alice用最寬的去蓋Bob的力所能及的最寬的,結果WA啦,現在發現,方向反了!貪心的策略應是從小到大,讓Alice的每個矩形都能發揮其最大價值,即:取其中一維:寬度,從小到大來訪問,每訪問一個,在高度中從小到大搜出所有滿足的高度,蓋掉力所能及的最大的那個(multiset中有查找函數upper_bound(x),返回第一個大於x的迭代器)。第一次用pair與multiset,滋味不錯~~ [cpp]   #include <cstdio>   #include <vector>   #include <set>   #include <algorithm>      using namespace std;      typedef pair<int, int> pii;   const int maxn = 100000 + 10;      int main()   {       int T, N, i, j, h, w;       scanf("%d", &T);       while(T--)       {           scanf("%d", &N);           vector<pii> A, B;           for(i = 0; i < N; i++)           {               scanf("%d%d", &h, &w);               A.push_back(make_pair(h, w));           }           for(i = 0; i < N; i++)           {               scanf("%d%d", &h, &w);               B.push_back(make_pair(h, w));           }           sort(A.begin(), A.end());           sort(B.begin(), B.end());           int cnt = 0;           multiset<int> s;           s.clear();           for(i = 0, j = 0; i < N; i++)           {               while(j < N && A[i].first >= B[j].first) s.insert(B[j++].second);               if(!s.empty())  www.2cto.com             {                   multiset<int>::iterator p = s.upper_bound(A[i].second);                   if(p != s.begin())                   {                       s.erase(--p);                       cnt++;                   }               }           }           printf("%d\n", cnt);       }       return 0;   }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved