本文主要是介绍Codeforces #246 (Div. 2) B. Football Kit,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意是:有n个队伍,每个队伍有主场衣服颜色x[i] 客场衣服颜色y[i]
每个队都要作为主场和另外n-1支客场队进行比赛
在这之中如果主场衣服和另一队的客场衣服颜色相同
那么客场队就换上自己的主场衣服(保证主场 客场衣服颜色不同)
最后输出每个队使用主场衣服和客场衣服的次数
开始的做法是暴力,因为n最大有10的5次方,当时想到会超时,但是看到那么多人写出来
想着不会很复杂啊,结果就抱着试一试的心态交了...毫无疑问的TLE了
接着就想着把算法优化为O(n)
解题思路:
每个队必然有(n-1)次作为主场参加比赛,所以每个队主场衣服最少使用(n-1)次
而主场衣服使用的另外一种情况是这个队作为客场参加比赛,客场衣服和别人的主场衣服颜色相同了,那么这个队就会再使用主场衣服,因此只要再加上这个队的客场衣服颜色在所有队的主场衣服颜色中出现的次数即可(数组x中y[i]出现的次数)
同理分析每个队的客场衣服,如果不出现颜色相同的情况就会使用(n-1)次,即最多使用(n-1)次
因此同上用(n-1)减去(数组x中y[i]出现的次数)
可以用一个数组记录y[i]在x中出现的次数,这样可以保证算法O(n)
代码如下:
#include <set>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 100010
#define ll long long
using namespace std;int y[MAXN];
int cx[MAXN], cy[MAXN];
int a[MAXN];int main(void) {int n, x;while(cin >> n) {memset(cx, 0, sizeof(cx));memset(cy, 0, sizeof(cy));memset(a, 0, sizeof(a));for(int i=0; i<n; ++i) {cin >> x >> y[i];a[x]++;}for(int i=0; i<n; ++i) {cx[i] = n-1+a[y[i]];cy[i] = n-1-a[y[i]];}for(int i=0; i<n; ++i) {printf("%d %d\n", cx[i], cy[i]);}}return 0;
}
这篇关于Codeforces #246 (Div. 2) B. Football Kit的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!