NC232585. 金牌厨师
描述
Phenix作为食堂的金牌厨师,每天的工作是为同学们准备饭菜,Phenix做出的每一种菜都有一个辣度值,范围是。作为厨师,Phenix提前了解了m位同学的辣度接受范围,第i位同学的辣度接受范围被描述为,表示该同学可以接受辣度值位于这个区间的菜。由于众口难调,每天Phenix会选出部分同学,做出能让这部分同学都接受的辣度的菜。Phenix作为金牌厨师对每天工作的满意程度定义为选出的同学的人数和能让这部分同学都接受的菜的种类数(这里理解为一种辣度对应一种菜)两者中的最小值,即。
现在你需要想办法让Phenix的满意程度最大。
输入描述
第一行两个整数,表示菜的辣度最大值和同学的人数。
接下来行,每行两个整数依次表示第个同学的辣度接受范围
输出描述
一行,表示满意度的最大值。
示例1
输入:
5 5 3 5 1 2 2 5 2 5 4 5
输出:
3
说明:
最优策略为:选择第1,3,4位同学,他们的辣度接受范围分别是[3,5],[2,5],[2,5],所以能让他们都接受的菜的辣度是3,4,5,此时k=3,x=3,满意度=min(k,x)=3C++(g++ 7.5.0) 解法, 执行用时: 91ms, 内存消耗: 2936K, 提交时间: 2023-02-01 21:29:14
#include <bits/stdc++.h> #define fi first #define se second using namespace std; typedef pair<int, int> PII; const int N = 300005; int n, m, res; PII w[N]; int main() { cin >> n >> m; for (int i = 1; i <= m; i ++ ) scanf("%d %d", &w[i].fi, &w[i].se); sort(w + 1, w + m + 1); priority_queue<int, vector<int>, greater<int>> q; for (int i = 1; i <= m; i ++ ) { q.push(w[i].se); while (q.top() - w[i].fi + 1 < q.size()) q.pop(); res = max(res, min((int)q.size(), q.top() - w[i].fi + 1)); } cout << res; }
C++ 解法, 执行用时: 187ms, 内存消耗: 2936K, 提交时间: 2022-01-18 14:51:34
#include<bits/stdc++.h> using namespace std; const int N=3e5+10; struct f{ int l,r; }p[N]; bool cmp(const f&a,const f&b){ if(a.l!=b.l) return a.l<b.l; else return a.r<b.r; } int n,m,ans; int main(){ cin>>n>>m; for(int i=1;i<=m;i++) cin>>p[i].l >>p[i].r ; sort(p+1,p+1+m,cmp); priority_queue<int,vector<int>,greater<int> >q; for(int i=1;i<=m;i++){ q.push(p[i].r ); while(q.top()-p[i].l+1<q.size()) q.pop(); int k=q.size(); ans=max(ans,min(k,q.top()-p[i].l+1)); } cout<<ans; }