1073 多选题常见计分法

1073 多选题常见计分法

解题代码

#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
#include<set>
#include<string>
using namespace std;
typedef pair<string, int> pa;
bool cmp(pa a, pa b) {
	return a.second != b.second ? a.second > b.second : a.first < b.first;
}
int main() {
	int n, k, temp, cnt;
	char c;
	cin >> n >> k;
	vector<set<char> > v(k);
	vector<int> sc(k);
	for (int i = 0; i < k; i++) {
		cin >> sc[i] >> temp >> cnt;
		for (int j = 0; j < cnt; j++) {
			getchar();
			cin >> c;
			v[i].insert(c);
		}
	}
	unordered_map<string, int> mm;
	for (int i = 0; i < n; i++) {
		double sum = 0;
		for (int j = 0; j < k; j++) {
			set<char> sn;
			getchar(); getchar();
			cin >> cnt;
			for (int l = 0; l < cnt; l++) {
				cin >> c;
				sn.insert(c);
			}
			bool flag = true;
			for (auto x : sn) {
				if (v[j].find(x) == v[j].end()) {
					mm[to_string(j + 1) + "-" + x]++;
					flag = false;
				}
			}
			for (auto x : v[j]) {
				if (sn.find(x) == sn.end()) {
					mm[to_string(j + 1) + "-" + x]++;
				}
			}
			if (flag && sn == v[j]) sum += sc[j];
			else if (flag) sum += 0.5*sc[j];
			getchar();
		}
		if (i) printf("\n");
		printf("%.1f", sum);
	}
	if (mm.size() == 0) printf("\nToo simple");
	else {
		vector<pair<string, int> > vv;
		for (auto x : mm) vv.push_back(x);
		sort(vv.begin(), vv.end(), cmp);
		int M = vv.begin()->second;
		for (auto x : vv) {
			if (x.second == M)
				printf("\n%d %s", M, x.first.c_str());
		}
	}
	return 0;
}

测试结果

在这里插入图片描述

问题整理

1.相对柳神,我觉得在考场我还是选择这种方式解题好理解一点,对于位运算符还是不太行的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值