CF119B Before Exam 题解


题意

分析

由于已经强制配好了 \(q\) 张卡片,那么现在为了让熟练度最大,就将剩下的定理中熟练度最大的 \(\left\lfloor\dfrac{n}{k}\right\rfloor\) 个定理配成一张卡片,此时熟练度的最大值就是这 \(\left\lfloor\dfrac{n}{k}\right\rfloor\) 个定理熟练度的平均数和已配好卡片平均数的最大值。同理,最小熟练度就是剩下定理中熟练度最小的 \(\left\lfloor\dfrac{n}{k}\right\rfloor\) 个定理的平均数和已配好卡片平均数的最小值。

代码

#include 
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int MAXN=107;
inline void qread(){}template
inline void qread(T1 &a,T2&... b)
{
	register T1 x=0;register bool f=false;char ch=getchar();
	while(ch<'0') f|=(ch=='-'),ch=getchar();
	while(ch>='0') x=(x*10)+(ch^48),ch=getchar();
	x=(f?-x:x);a=x;qread(b...);
}
templateinline T1 qmin(const T1 &x,const T2 &y){return xinline T1 qmax(const T1 &x,const T2 &y){return x>y?x:y;}
int n,k,q;vectora,c;
int b[MAXN][MAXN];
bitsetvis;vectortmp;
int mx,mn=2139062143;
map,bool>mp;
int main()
{
	qread(n,k);int i,j;a.resize(n+1);for(i=1;i<=n;i++) qread(a[i]);qread(q);
	int m=n/k,cnt=0; // cnt表示已配好的卡片数
	for(i=0;i=m&&k-cnt>0)
	{
		sort(c.begin(),c.end(),greater());for(i=0;i