【題意】:有n個士兵,第i個士兵可以裝備重量在[ai,bi]范圍內的武器,有m個武器,每個武器有一個重量wi,問最多可以裝備多少個士兵。

【題解】:           
           以下為watashi的題解:         
          很經典的排序加貪心模型。首先按b排序,然后掃描每個士兵,每次選取盡量小的滿足a<w<b的武器裝備該士兵。

          剛開始忘記寫二分,直接O(n*m)的復雜度過了,300MS,后面想起來可以用二分加速,復雜度為O(nlogm),60MS。
          第一次用multiset,感覺不錯,很方便。

【代碼】:
 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "algorithm"
 5 #include "vector"
 6 #include "queue"
 7 #include "cmath"
 8 #include "string"
 9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 #include "set"
13 using namespace std;
14 #define pb push_back
15 #define mp make_pair
16 #define fi first
17 #define se second
18 #define sof(x) sizeof(x)
19 #define lc(x) (x << 1)
20 #define rc(x) (x << 1 | 1)
21 #define lowbit(x) (x & (-x))
22 #define ll long long
23 #define MAX 40010
24 #define maxn 3000
25 typedef pair<intint> pii;
26 int n, m;
27 pii p[maxn];
28 bool cmp(const pii &a, const pii &b) {
29     return a.se < b.se;
30 }
31 
32 int main() {
33     multiset<int> s;
34     multiset<int>::iterator it;
35     while(cin >> n >> m) {
36         s.clear();
37         for(int i = 0; i < n; i++) cin >> p[i].fi >> p[i].se;
38         for(int i = 0, a; i < m; i++) {
39             cin >> a;
40             s.insert(a);
41         }
42         sort(p, p + n, cmp);
43         int ans = 0;
44         for(int i = 0; i < n; i++) {
45             it = s.lower_bound(p[i].fi);
46             if(it != s.end() && *it <= p[i].se) {
47                 ans++;
48                 s.erase(it);
49             }
50         }
51         cout << ans << endl;
52     }
53     return 0;
54 }
55