题解:P13759 Basketball
题解:P13759 Basketball
模拟、贪心。
题目思路
-
使每一组的中位数最小。所以我们先排序。我们令 \(j= \frac{\frac{n}{m}+1}{2}\)。则每一组中位数最小的位置为 \(i \cdot j\)。
-
考虑证明这个位置的中位数最小。如果一个位置小于 \(i \cdot j\),那么前面的 \(i\) 组的数的个数最大为 \(i \cdot j-1\) 个数,但是前 \(i\) 组需要 \(i \cdot j\) 个数,显然不足。因此所有合法的方案都满足中位数的位置要大于等于 \(i \cdot j\),所以上述方案一定是最优的。所以我们在前 \(i \cdot j\) 个数中,每 \(j\) 个数中选择最大的数求和。因为前面已经排序,所以这些数为 \(a_{i \cdot j}\)。
综上,正解为:
\[(\sum_{i = 1}^{m} x_i)_{\min}=\sum^{m}_{i=1} a_{i \cdot j}
\]
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll n,m,a[N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ll j=(n/m+1)/2,ans=0;
for(int i=1;i<=m;i++){
ans+=a[i*j];
}
cout<<ans;
return 0;
}