专栏文章

题解:P14575 坤班

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

文章操作

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

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

思路

考虑二分查找班级的个数。
先统计每个学科的任课老师所教班级总数与愿意当班主任的老师总数,确定班级上界。
check函数中遍历所有老师,若老师同意当班主任且这个老师去当班主任不会让此科目可以教授的班级数量过少,就让这个老师去当班主任,最后判断班主任个数够不够。

代码

CPP
#include<bits/stdc++.h>
#define f(n) for(int i=1;i<=n;i++)
#define int long long
#define endl "\n" 
#define IOS cin.tie(0),cout.tie(0),ios::sync_with_stdio(0)
using namespace std;
int n,m,sum,minx=INT_MAX,l,r,mid,bzr,s[500005],ss[500005];
struct T{int a,b,c;}t[500005];
int check(int x){
	memcpy(ss,s,sizeof(s));
	bzr=0;
	f(n)if(t[i].c)if(ss[t[i].a]>x)bzr++,ss[t[i].a]--;
	//若老师同意当班主任且老师去当班主任不会让其科目可以教授的班级数量过少,就让这个老师当班主任 
	return bzr>=x;
}
signed main(){
	IOS;cin>>n>>m;
	f(n)cin>>t[i].a>>t[i].b>>t[i].c,sum+=t[i].c,s[t[i].a]+=t[i].b;//统计每个学科可以教的班数 
	f(m)minx=min(minx,s[i]);
	minx=min(minx,sum);//确定班级上界 
	l=0,r=minx;//标准的二分 
	while(l<r){
		mid=(l+r+1)/2;
		if(check(mid))l=mid;
		else r=mid-1;
	}
	cout<<l;
	return 0;
}

评论

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

正在加载评论...