[传智杯 #3 决赛] 商店
题目背景
disangan333 想给 disangan233 买一个礼物,于是他和你一起逛商店。
题目描述
有 n n n 名同学去逛商店,店里有 m m m 个物品,第 i i i 人有 w i w_i wi 块钱,第 i i i 个物品价格 c i c_i ci 元。
每个人至多买一个物品,每个物品只能被买一次,问最多有多少人能买到物品。
对于所有数据, n , m ≤ 1 0 5 n,m \leq 10^5 n,m≤105, w i , c i ≤ 1 0 9 w_i,c_i\leq 10^9 wi,ci≤109。
输入格式
输入共 3 3 3 行。
第 1 1 1 行输入 2 2 2 个正整数 n , m n,m n,m。
第 2 2 2 行输入 n n n 个整数 w 1 … w n w_1\ldots w_n w1…wn, w i w_i wi 表示第 i i i 人的钱。
第 3 3 3 行输入 m m m 个整数 c 1 … c m c_1\ldots c_m c1…cm, c i c_i ci 表示第 i i i 个物品的价格。
输出格式
对于所有数据, n , m ≤ 1 0 5 n,m \leq 10^5 n,m≤105, w i , c i ≤ 1 0 9 w_i,c_i\leq 10^9 wi,ci≤109。
样例 #1
样例输入 #1
15 20
4 3 9 10 7 7 5 3 6 1 8 6 6 1 5
12 4 1 9 8 5 8 6 4 5 18 8 14 9 9 7 20 11 8 19
样例输出 #1
10
考察算法
贪心策略 + 优先队列
AC代码
#include "bits/stdc++.h"
using namespace std;
#define maxn 100005
/*
* 1e5,时间复杂度要nlgn
* 贪心策略,优先队列优化
*/
int n,m;
int c[maxn];
int ans;
priority_queue<int,vector<int>,greater<int>> pq; //队头为最小值
int main() {
cin >> n >> m;
for(int i = 1,x; i <= n; i++) {
cin >> x;
pq.push(x);
}
for(int i = 1; i <= m; i++)
cin >> c[i];
sort(c+1,c+m+1);
for(int i = 1,flag; i <= m; i++) {
while(!pq.empty()) {
flag = pq.top();
pq.pop();
if(flag >= c[i]) {
ans++;
// cout << flag << " ," << c[i] << endl;
break;
}
}
}
cout << ans << endl;
return 0;
}