列表

详情


NC232585. 金牌厨师

描述

Phenix作为食堂的金牌厨师,每天的工作是为同学们准备饭菜,Phenix做出的每一种菜都有一个辣度值,范围是。作为厨师,Phenix提前了解了m位同学的辣度接受范围,第i位同学的辣度接受范围被描述为,表示该同学可以接受辣度值位于这个区间的菜。由于众口难调,每天Phenix会选出部分同学,做出能让这部分同学接受的辣度的菜。Phenix作为金牌厨师对每天工作的满意程度定义为选出的同学的人数k和能让这部分同学都接受的菜的种类数x(这里理解为一种辣度对应一种菜)两者中的最小值,即min(k,x)n,m

现在你需要想办法让Phenix的满意程度最大。

输入描述

第一行两个整数n,m,表示菜的辣度最大值和同学的人数

接下来m行,每行两个整数l_i,r_i依次表示第i个同学的辣度接受范围

输出描述

一行,表示满意度的最大值。

示例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)=3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(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;
}

上一题