CF1475C - 题解
题意理解
- 数据组数
- 男孩 个,女孩 个,舞伴 对
思路
存储数据
vector<pair<int, int>> dancePair;
计算答案
方法一
期望得分:20
暴力枚举每一对舞伴
register unsigned long long ans = 0;
for (register int i = 0; i < k - 1; ++i) {
for (register int j = i + 1; j < k; ++j) {
if ((dancePair[i].first != dancePair[j].first) and (dancePair[i].second != dancePair[j].second)) {
++ans;
}
}
}
cout << ans << endl;
结果第四个点 TLE 了,一看时间复杂度 ,难道 过百万已经不灵验了?(好吧题目中的是两百万)
方法二
期望得分:100
仔细研究发现,我们可以枚举每一对舞伴,并将所有 对舞伴中除了与他们有相同的组成以外的加入答案中即可。
详细版: 共 对舞伴,除去本身后有 对舞伴,在剩下的 对舞伴中,与选择的舞伴中男生相同的有 对,与女生相同的有 对,则每次枚举需要增加的数量为
此时我们对每一对男生女生都重复计算了两次,则最后答案需要除以 。
int aryBoy[MAX_K], aryGirl[MAX_K];
for (register int i = 0, tmp; i < k; ++i) {
cin >> tmp;
++aryBoy[tmp];
}
for (register int i = 0, tmp; i < k; ++i) {
cin >> tmp;
++aryGirl[tmp];
}
register unsigned long long ans = 0;
for (register int i = 0; i < k; ++i) {
ans += k - aryBoy[dancePair[i].first] - aryGirl[dancePair[i].second] + 1;
}
ans /= 2;
cout << ans << endl;
向您推荐的文章