https://www.luogu.com.cn/problem/P8162
#include<bits/stdc++.h>
#define int long long
#define PII pair< int, int >
using namespace std;
const int N = 5e2 + 5, mod = 998244353;
int n, k;
PII a[N];
double q[N];
double daan = 0x3f3f3f3f, dan, bl;
template< typename T >inline void read(T &x){bool f=1;x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=!f;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}x=(f?x:-x);return;}
template< typename T, typename ... L > void read(T &a , L && ... b) { read(a); read(b ...); }
int ksm(int a, int b, int p){int ans = 1;while(b){if(b & 1)ans =(ans*a)%p;b >>= 1;a = (a*a) % p;}return ans;}
signed main(){
// freopen("a.in", "r", stdin);
// freopen("a.out","w",stdout);
read(n, k);
for (int i = 1; i <= n; i++){
read(a[i].second, a[i].first);
if (a[i].first == -1) a[i].first = 0x3f3f3f3f;
}
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; i++) swap(a[i].first, a[i].second);
for (int i = 0; i < k; i++){
for (int j = i + 1; j <= n; j++) q[j] = (double)a[j].first;
sort(q + i + 1, q + n + 1);
dan = 0;
bl = 1;
for (int j = 1; j <= i; j++){
dan += (double)a[j].second / bl;
bl += 1;
}
for (int j = i + 1; j <= k; j++) dan += (double)q[j] / bl;
daan = min(daan, dan);
}
printf("%.20lf", daan);
return 0;
}
感觉直接贪心也是对的。