1 条题解

  • 0
    @ 2025-8-24 22:26:28

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ZBAA_MKC
    基本退谷

    搬运于2025-08-24 22:26:28,当前版本为作者最后更新于2021-06-15 21:00:46,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    本题根据题意模拟即可。

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

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

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

    一开始我一直用的 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;
    }
    
    • 1

    信息

    ID
    6226
    时间
    2000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者