CppCPU占用时长 1秒内存使用限制 128MB题目描述有 �n 个县会对 �m 个候选人投票他们会按照一定顺序投票除非前一个候选人退出选举否则不会投下一个候选人的票现在问你哪一个候选人能够获胜?请问至少让多少候选人退出才能保证候选人 �k 获胜。如果说选票一样那么编号小的就获胜输入格式第一行输入三个数字 �n 1≤�≤1001≤n≤100�m 1≤�≤151≤m≤15�k 1≤�≤�1≤k≤m
首先,我们需要统计每个候选人的得票数。遍历每个县的投票顺序,将每个候选人的得票数加一,直到出现前一个候选人退出选举的情况。
然后,我们可以计算出当前最高得票数的候选人编号。如果最高得票数的候选人编号等于k,那么他就是获胜者,不需要任何候选人退出。否则,我们需要计算至少让多少候选人退出,才能保证候选人k获胜。我们只需要将其他候选人的得票数归零,然后重新统计最高得票数的候选人编号,直到最高得票数的候选人编号等于k。
下面是一个可能的实现:
#include
int main() { int n, m, k; cin >> n >> m >> k;
vector<vector<int>> votes(n, vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> votes[i][j];
}
}
vector<int> counts(m, 0);
vector<bool> eliminated(m, false);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int candidate = votes[i][j] - 1;
if (!eliminated[candidate]) {
counts[candidate]++;
break;
}
}
}
int maxCount = *max_element(counts.begin(), counts.end());
int winner = max_element(counts.begin(), counts.end()) - counts.begin() + 1;
cout << winner << endl;
int minEliminations = 0;
while (winner != k) {
int minCount = maxCount;
for (int i = 0; i < m; i++) {
if (!eliminated[i] && counts[i] < minCount) {
minCount = counts[i];
}
}
for (int i = 0; i < m; i++) {
if (counts[i] == minCount) {
eliminated[i] = true;
minEliminations++;
}
}
counts.assign(m, 0);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int candidate = votes[i][j] - 1;
if (!eliminated[candidate]) {
counts[candidate]++;
break;
}
}
}
maxCount = *max_element(counts.begin(), counts.end());
winner = max_element(counts.begin(), counts.end()) - counts.begin() + 1;
}
cout << minEliminations << endl;
return 0;
原文地址: http://www.cveoy.top/t/topic/iz3V 著作权归作者所有。请勿转载和采集!