CF1359A 题解
洛谷链接&CF 链接
题目简述
共有 \(T\) 组数据。
对于每组数据给出 \(n,m,k\),表示 \(k\) 名玩家打牌,共 \(n\) 张牌,\(m\) 张王,保证 \(k \mid n\),记得分为拿到最多王的玩家手中王数减去拿到第二多王的玩家手中的王数,求得分最大值。
思路
经典贪心题。
首先需特判两种情况:
-
\(m\) 为 \(0\)。
-
\(n / k \ge m\)。
首先对于情况 \(1\),直接输出 \(0\) 即可,因为没有王。
对于情况 \(2\),直接输出 \(m\) 即可,构造就是把 \(m\) 张王全给一个人,这样最大差就是 \(m\)。
对于一般情况,就先把能给的王全给一个人,其余王平均分即可。
具体代码实现如下:
#include<iostream>
using namespace std;
int T, n, m, k;
int main(){
cin >> T;
while(T --) {
cin >> n >> m >> k;
int num = n / k; // 计算每个人牌数
if(m == 0) { cout << "0\n"; continue; } // 特判情况 1
if(num >= m) { cout << m << endl; continue; } // 特判情况 2
cout << num - (m - num) / (k - 1) - ((m - num) % (k - 1) != 0) << endl; // 公式,上有构造及证明
}
return 0;
}
提交记录
\[\text{The End!}
\]