【题解】P7080 [NWRRC2013]Ballot Analyzing D

· · 题解

本题根据题意模拟即可。

使用三个数组存储名字,一个存储选票,一个存储票数。

用二层循环,验证每一个人的选票是否有效,如果有效就记录他选的是哪个人,无效就计入无效选票的张数。

最后排序后按要求输出即可。

一开始我一直用的 cinprintf 的自带四舍五入但我发现总是会错个别的点(这题没有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;
}