专栏文章

P14575 坤班 题解

P14575题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@min2cblx
此快照首次捕获于
2025/12/01 19:25
3 个月前
此快照最后确认于
2025/12/01 19:25
3 个月前
查看原文

1. 题意解释

我懒,自己看题干去吧。

2. 思路

不难发现答案具有单调性,考虑二分答案。
考虑对于某个答案 xx 如何判断其合法性。
我们预处理出对于某种学科 ii,在不考虑班主任的情况下总共最多可以教多少个班,记为 sumisum_i
然后我们考虑每个老师 ii,若 sumai>xsum_{a_i}>x,则他当班主任后依然可以使得 xx 个班级的教学需求得到满足,就让他去当班主任,然后 sumaisum_{a_i} 减一。
可以发现这样的策略一定是不劣的,于是就做完了。

3. 代码实现

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[500500],b[500500],c[500500],sum[500500],tmp[500500],minn=1e18,cnt,ans;
bool check(int x){
	int res=0;
	for(int i=1;i<=m;i++){
		tmp[i]=sum[i];
	}
	for(int i=1;i<=n;i++){
		if(tmp[a[i]]>x&&b[i]>=1&&c[i]==1){
			res++;
			tmp[a[i]]--;
		}
	}
	if(res>=x){
		return true;
	}
	return false;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i]>>c[i];
		sum[a[i]]+=b[i];
		cnt+=c[i];
	}
	for(int i=1;i<=m;i++){
		minn=min(minn,sum[i]);
	}
	minn=min(minn,cnt);
	int l=0,r=minn;
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid)){
			ans=mid;
			l=mid+1;
		}
		else{
			r=mid-1;
		}
	}
	cout<<ans;
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...