我尝试回答编写代码来解决this问题,但我在测试15时仍然得到了错误的答案,而且我不知道代码中缺少什么。 我尝试了很多测试用例,但代码已经正确地解决了这些问题。
我的代码:
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main()
{
int c; cin >> c;
int v; cin >> v;
if (c == 1 && v == 0)
{
cout << 1 << " " << 1;
}
else
{
int cArray[c + 1];
int voting[v][c];
for (int j = 0; j<v; j++)
{
for (int z = 0; z<c; z++)
{
int temp; cin >> temp;
voting[j][z] = temp;
}
}
for (int j = 0; j <= c; j++)cArray[j] = 0;
for (int j = 0; j<v; j++)cArray[voting[j][0]]++;
int maxim = 0;
int maxN = 0;
int count = 0;
map<int, int > cand;
for (int j = 1; j <= c; j++)
{
if (cArray[j]>maxN)
{
cand.clear();
cand[j] = 1;
maxN = cArray[j];
maxim = j;
count = 0;
}
else if (cArray[j] == maxN)
{
cand[j] = 1;
count++;
}
}
if (count == 0)
cout << maxim << " " << 1;
else
{
for (int j = 0; j<v; j++)
{
for (int z = 1; z<c; z++)
{
if (cand.count(voting[j][z]))
{
cArray[voting[j][z]]++;
break;
}
}
}
maxim = 0;
maxN = 0;
count = 0;
for (int j = 1; j <= c; j++)
{
if (cArray[j]>maxN)
{
maxN = cArray[j];
maxim = j;
count = 0;
}
else if (cArray[j] == maxN)
{
count++;
}
}
cout << maxim << " " << 2;
}
}
return 0;
}
答案 0 :(得分:1)
您检查第一轮(胜利或前两名候选人)的算法似乎是错误的。看起来你期望前两位候选人拥有相同数量的主要选票 - 事实并非如此。如果有超过50%的选票,你想选出前两名候选人,而前一名候选人获胜。
我不想给你答案(因为这是练习的重点),但你需要重新考虑如何处理投票的第一部分。
另请注意,一旦某人投票选出前两位候选人之一,他们的二次投票就不应该计入另一位候选人(您目前正在进行投票)。