1 条题解
-
0
这题不知道如果暴力去其他人的字符串里查是否能完成。这里提供的做法是把字符串转换成一个对应的
26
进制整数(因为保证了长度相同,所以可以直接a
~z
变换成0
~25
)。然后用三个数组表示每个人有哪些字符串出现过。需要注意多组数据时要及时清空数组,保证上一组数据不会影响到当前数据。
这题学过
map
的同学可能会想到使用map<string,int>
来处理。但需要注意,map
的查询修改这些操作的时间复杂度都是 而不是 的哟!#include <bits/stdc++.h> using namespace std; int t, n; string temp; //储存字符串对应的整数 int a[1005], b[1005], c[1005]; //储存每个整数是否出现过 bool aa[26 * 26 * 26 + 5]; bool bb[26 * 26 * 26 + 5]; bool cc[26 * 26 * 26 + 5]; //每个人的得分 int a_score, b_score, c_score; //将参数转换为对应的整数 int s2i(string s) { return (s[0] - 'a') * 26 * 26 + (s[1] - 'a') * 26 + (s[2] - 'a'); } int main() { cin >> t; while (t--) { //输入 cin >> n; for (int i = 1; i <= n; i++) { cin >> temp; a[i] = s2i(temp); aa[a[i]] = true; } for (int i = 1; i <= n; i++) { cin >> temp; b[i] = s2i(temp); bb[b[i]] = true; } for (int i = 1; i <= n; i++) { cin >> temp; c[i] = s2i(temp); cc[c[i]] = true; } //统计得分 a_score = b_score = c_score = 0; for (int i = 1; i <= n; i++) { int cnt = 1; // 几个人有a[i] if (bb[a[i]]) cnt++; if (cc[a[i]]) cnt++; //计分 if (cnt == 1) a_score += 3; if (cnt == 2) a_score += 1; } for (int i = 1; i <= n; i++) { int cnt = 1; // 几个人有b[i] if (aa[b[i]]) cnt++; if (cc[b[i]]) cnt++; //计分 if (cnt == 1) b_score += 3; if (cnt == 2) b_score += 1; } for (int i = 1; i <= n; i++) { int cnt = 1; // 几个人有c[i] if (aa[c[i]]) cnt++; if (bb[c[i]]) cnt++; //计分 if (cnt == 1) c_score += 3; if (cnt == 2) c_score += 1; } //输出 cout << a_score << " " << b_score << " " << c_score << "\n"; //清空,准备做下一组数据 for (int i = 1; i <= n; i++) aa[a[i]] = false; for (int i = 1; i <= n; i++) bb[b[i]] = false; for (int i = 1; i <= n; i++) cc[c[i]] = false; } return 0; }
- 1
信息
- ID
- 1095
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 26
- 已通过
- 8
- 上传者