【题意】:有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<int, int> 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