题解:P13759 Basketball

题解:P13759 Basketball

Link

模拟、贪心。

题目思路

  • 使每一组的中位数最小。所以我们先排序。我们令 \(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;
}
posted @ 2025-08-18 23:09  M1_Byte  阅读(6)  评论(0)    收藏  举报