【题解】P7080 [NWRRC2013]Ballot Analyzing D
本题根据题意模拟即可。
使用三个数组存储名字,一个存储选票,一个存储票数。
用二层循环,验证每一个人的选票是否有效,如果有效就记录他选的是哪个人,无效就计入无效选票的张数。
最后排序后按要求输出即可。
一开始我一直用的 cin 和 printf 的自带四舍五入但我发现总是会错个别的点(这题没有SPJ是真的恶心), 于是我就手写了四舍五入函数,然后就AC了。
详情请见代码注释
#include <bits/stdc++.h>
using namespace std;
string s[15];
char c[1005][15];
int cnt[15];
int n, m;
double sswr(int x) //四舍五入函数
{
double ans = x * 1.0 / m;
return floor(ans * 10000 + 0.5) / 100.0;
}
int main()
{
cin >> n >> m;
int inv = 0; //储存无效票个数
for (int i = 1; i <= n; i++)
{
cin >> s[i];
}
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> c[i][j];
}
}
for (int i = 1; i <= m; i++)
{
int t = 0;
int id;
for (int j = 1; j <= n; j++)
{
if (c[i][j] == 'X') //验证每个人的票是否属于有效票
{
t++;
id = j;
}
}
if (t != 1) //不是1就计入无效票
{
inv++;
}
else
{
cnt[id]++; //有效就给他记上
}
}
for (int i = 1; i < n; i++) //手写冒泡排序,懒得写结构体
{
for (int j = 1; j < n; j++)
{
if (cnt[j] < cnt[j + 1])
{
swap(cnt[j], cnt[j + 1]);
swap(s[j], s[j + 1]);
}
}
}
for (int i = 1; i <= n; i++) //输出(别忘换行)
{
cout << s[i] << " ";
cout << sswr(cnt[i]) << "%" << endl;
}
//还有无效票别忘了
cout << "Invalid " << sswr(inv) << "%";
return 0;
}