LuoguP7080 [NWRRC2013]Ballot Analyzing Device 题解

Content

有 \(n\) 名选手参加一个比赛,有 \(m\) 个人为他们投票。第 \(i\) 个人的投票情况用一个长度为 \(n\),并且仅包含 .X 两个字符的字符串,其中,如果第 \(j\) 位是 X,则第 \(i\) 个人将票投给了第 \(j\) 名选手,否则没有。规定每个投票者能且仅能将票投给一个人,否则都算无效票(即投的票数 \(\geqslant 2\) 或者 \(=0\))。请将每名选手按照他们所得到的票的比例排序(如果有两名选手得到的票的比例相同,在投票次序中先出现的那名选手排在前面),并输出他们的名字和得票比例,最后还要输出无效票所占的比例。

比例输出为百分数,\(\%\) 前面的部分四舍五入到 \(2\) 位小数。

数据范围:\(2\leqslant n\leqslant 10,1\leqslant m\leqslant 1000\)。

Solution

直接按照题意模拟就好,不过要注意四舍五入的问题。printf 的自动四舍五入有时候会出现 bug 导致 WA on test 19,所以需要自己手写一个函数来处理四舍五入。具体实现可以参考这里的代码。

Code

int n, m, in;
string tp;
struct user {
	string name;
	int val, id;
	bool operator < (const user& cz) const {return val > cz.val || (val == cz.val && id < cz.id);}
}a[17];

inline void judge(string s) {
	int len = s.size(), xnum = 0, xpl;
	F(i, 0, len - 1) if(s[i] == 'X') xnum++, xpl = i + 1;
	if(xnum != 1) {in++; return;}
	a[xpl].val++;
}
inline double getans(int x) {
	double ans = x * 1.0 / m, aa = ans * 10000;
	return floor(aa + 0.5) / 100.0;
}

int main() {
	n = Rint, m = Rint;
	F(i, 1, n) {
		cin >> a[i].name;
		a[i].id = i;
	}
	F(i, 1, m) {
		cin >> tp;
		judge(tp);
	}
	sort(a + 1, a + n + 1);
	F(i, 1, n) {
		cout << a[i].name << ' ';
		double ans = getans(a[i].val);
		printf("%.2lf%%\n", ans);
	} 
	printf("Invalid %.2lf%%\n", getans(in));
	return 0;
}
上一篇:mysql 快速备份表数据


下一篇:commitizen进行git规范化提交