题目传送门
思路
由题知,现在已经有
q
q
q 个定理被配对,我们要让熟练度最大,就要让剩下中最大熟练度
的
⌊
n
k
⌋
\lfloor \frac{n}{k} \rfloor
⌊kn⌋ 个定理,那么此时的熟练度就是这
⌊
n
k
⌋
\lfloor \frac{n}{k} \rfloor
⌊kn⌋ 个定理熟练度的平均数和已经配好平均数的最大值。最小值是同理的。
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=105;
long long n,k;
long long a[MAXN];
long long q,sum,x,maxx,cnt;
long long ans[MAXN];
bool book[MAXN];
double ans1,ans2;
int main() {
cin>>n>>k;
for(int i=1; i<=n; i++){
cin>>a[i];
}
cin>>q;
for(int i=1; i<=q; i++) {
sum=0;
for(int j=1; j<=(n/k); j++) {
cin>>x;
book[x]=1;
sum+=a[x];
}
minn=min(minn,sum);
maxx=max(maxx,sum);
}
for(int i=1; i<=n; i++) {
if(!book[i]){
ans[++cnt]=a[i];
}
}
if(cnt<=(n-k*(n/k))) {
ans1=minn/(n/k*1.0);
ans2=maxx/(n/k*1.0);
cout<<fixed<<setprecision(10)<<ans1<<" "<<fixed<<setprecision(10)<<ans2<<endl;
return 0;
}
sort(ans+1,ans+cnt+1);
sum=0;
for(int i=1; i<=(n/k); i++){
sum+=ans[i];
}
minn=min(minn,sum);
sum=0;
for(int i=cnt; i>=cnt-(n/k)+1; i--){
sum+=ans[i];
}
maxx=max(maxx,sum);
ans1=minn/(n/k*1.0);
ans2=maxx/(n/k*1.0);
cout<<fixed<<setprecision(10)<<ans1<<" "<<fixed<<setprecision(10)<<ans2<<endl;
return 0;
}