Codeforces Round #246 (Div. 2)

简介:

主题链接:CF|Round246|DIV2

本场比赛他们拿出前两分钟后,C。

不是真的很有趣。

A:简单统计。时间复杂度:O(N)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 2010;
int a[N];

int main(){
    int n, k;
    scanf("%d%d", &n, &k);
    int cnt = 0;
    for(int i = 0; i < n; ++i){
        int x;
        scanf("%d", &x);
        if(5 - x >= k) ++cnt;
    }
    printf("%d\n", cnt / 3);
    return 0;
}

B:数据较大。 简单模拟会超时。 能够考虑。作为一个队主场(n-1)场肯定是主队,还有可能的是当该队客场比赛时。 颜色与主队一样, 这样仅仅要hash一下同种颜色的主队个数就可以。 最后能够依据总的比赛数 - 主队的次数得到客队的次数。时间复杂度O(N)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int x[N];

int main(){
    int n, k;
    scanf("%d", &n);
    for(int i = 0; i < n; ++i){
        scanf("%d%d", &a[i], &b[i]);
        ++x[a[i]];
    }

    for(int i = 0; i < n; ++i){
        int ans = n - 1 + x[b[i]];
        if(a[i] == b[i]) ans -= 1;
        printf("%d %d\n", ans, n*2 - 2 - ans);
    }
    return 0;
}

C:乱搞题。 题意非常easy。 就是能够互换之间相隔为质数个数的数字,得到 一个有序的序列。

YY了一个定理:随意一个数都能够由最多5个质数的和表示(原来是哥德巴赫猜想:囧), 刚好最大操作个数<=5*n。

这样先预处理出全部的素数。 每次二分素数, 推断并进行交换。  时间复杂度:O(N*sqrt(N))

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1e6 + 1;
bool isPrime[N];
int a[N], prime[N];
int p[N];
int cnt;
int x[N], y[N];

void gao(){
	int k = sqrt(N*1.0);
	int i = 2;
	while(i <= k){
		for(int j = i*i; j < N; j += i) isPrime[j] = 1;
		++i;
		while(i <= k && isPrime[i]) ++i;
	}

	for(int i = 2; i < N; ++i){
		if(!isPrime[i]) prime[cnt++] = i;
	}
}

int foo(int k){
	int l = 0, r = cnt - 1;
	while(l < r){
		int m = (l + r + 1) >> 1;
	//	printf("m = %d\n", m);
		if(prime[m] <= k) l = m;
		else r = m - 1;
	}
	return l;
}

int main(){
	int n;
	scanf("%d", &n);
	gao();
//	for(int i = 0; i < 30; ++i) printf("%d  ", prime[i]);
	for(int i = 1; i <= n; ++i){
		scanf("%d", &a[i]);
		p[a[i]] = i;
	}
 //   foo(3);
	int ans = 0;
	for(int i = 1; i <= n; ++i){
		int dif = abs(p[i] - i) + 1;
		if(p[i] > i){
			int tmp = dif;
			int xx = p[i], yy = i;
			while(tmp != 0){
	//			printf("%d en\n", tmp);

				int k = foo(tmp);
		//		printf("%d\n",foo(tmp));
				x[ans] = xx, y[ans] = xx - prime[k] + 1;
				p[a[y[ans]]] = xx;
				swap(a[xx], a[y[ans]]);
			    tmp -= prime[k];
				if(tmp != 0) tmp += 1;
				xx = y[ans++];
			}
		}
		else if(i > p[i]){
			int tmp = dif;
			int xx = p[i], yy = i;
			while(tmp != 0){
				int k = foo(tmp);
				x[ans] = xx, y[ans] = xx + prime[k] - 1;
				p[a[y[ans]]] = xx;
				swap(a[xx], a[y[ans]]);
			    tmp -= prime[k];
				if(tmp) ++tmp;
				xx = y[ans++];
			}
		}
	}
	printf("%d\n", ans);
	for(int i = 0; i < ans; ++i){
		if(x[i] < y[i]) printf("%d %d\n", x[i], y[i]);
		else  printf("%d %d\n", y[i], x[i]);
	}
	return 0;
}


版权声明:本文博客原创文章,博客,未经同意,不得转载。





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4725555.html,如需转载请自行联系原作者


相关文章
|
5月前
Codeforces Round #729 (Div. 2)
【6月更文挑战第4天】在这两个编程问题中,B. Plus and Multiply 要求判断通过加法和乘法操作数组是否能形成目标数 `n`。思路是形如 `x^a + yb = n` 的表达式,如果满足则能构造。C. Strange Function 关注的是找到最小正整数 `x` 使得 `x` 不是 `i` 的因子,计算这些值的和模 `10^9+7`。对于每个 `i`,偶数时 `f(i)` 是 3,奇数时是 2,利用因子与最大公约数计算周期性求和。
30 1
|
人工智能 算法 BI
Codeforces Round 891 (Div. 3)
Codeforces Round 891 (Div. 3)
118 0
Codeforces Round 891 (Div. 3)
Codeforces Round #178 (Div. 2)
在n条电线上有不同数量的鸟, Shaass开了m枪,每一枪打的是第xi条电线上的第yi只鸟,然后被打中的这只鸟左边的飞到第i-1条电线上,右边的飞到i+1条电线上,没有落脚点的鸟会飞走。
50 0
Codeforces Round #742 (Div. 2)
Codeforces Round #742 (Div. 2)
45 0
|
机器学习/深度学习 Go
codeforces round 885 (div. 2)
codeforces round 885 (div. 2)
95 0
|
人工智能 BI
Codeforces Round 827 (Div. 4)
Codeforces Round 827 (Div. 4)A~G题解
97 0
Codeforces Round #644 (Div. 3)(A~G)
Codeforces Round #644 (Div. 3)(A~G)
121 0
|
人工智能