Educational Codeforces Round 79 部分题解

A. New Year Garland

题意:

给定三种颜色的灯的数量,询问是否能排列成相邻颜色不同的情况。

思路:

不妨将数量分别设为 \(a,b,c,a\le b\le c\),不难发现原条件等价于 \(c\le a+b-1\)

代码

点击查看代码
void solve() {
	int n,c,x;
	cin >> n>>c>>x;
	if(n-1<=c+x&&c-1<=n+x&&x-1<=c+n)cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
}

B. Verse For Santa

题意:

一个总时长限制 \(s\),以及一个表示诗句各部分耗时的数组 \(a\)(数组元素顺序固定);

Vasya 背诵诗句时最多只能跳过其中一个部分(也可以不跳过),且必须按顺序背诵;
目标是找到需要跳过的那个部分的编号(从 1 开始),使得在总耗时不超过 s 的前提下,他能完整背诵的部分数量最多;若不跳过任何部分就能满足要求,输出 0;若有多个答案,输出任意一个即可。

思路:

读完题意直接枚举。

代码

点击查看代码
void solve() {
	int n, s;
	cin >> n >> s;
	int ss = 0;
	int r = -1, mx = 0, mi = 0;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		if (r == -1 && ss + a[i] > s) {
			r = i;
		}
		ss += a[i];
		if (r == -1 || i <= r) {
			if (a[i] > mx) {
				mx = a[i];
				mi = i;
			}
		}
	}
	if (r == -1) cout << 0 << endl;
	else cout << mi << endl;
}

C. Stack of Presents

题意:

圣诞老人有一叠按特定顺序堆叠的 \(n\) 个唯一编号礼物(从上到下为 \(a_1\)\(a_n\)),需按给定的 \(m\) 个唯一礼物清单 \(b_1\)\(b_n\) 的顺序派送。取某个礼物时,需先拿走其上方所有礼物,取该礼物(耗时 \(2k+1\) 秒,\(k\) 是其上方礼物数),再把拿走的礼物放回;放回时可任意调整这些被拿走礼物的顺序(下方礼物位置不变);圣诞老人已知完整派送清单,需以最优方式重新排序放回的礼物,求派送所有礼物的最短总耗时。

思路:

已经拿出来的礼物的顺序可以任意调整,用树状数组维护礼物是否已经发放。

代码

点击查看代码
void solve() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
		pos[a[i]] = i + 1;
	}
	for (int i = 0; i < m; i++) {
		cin >> b[i];
	}
	
	fill(bit, bit + n + 1, 0);
	int mx = 0;
	int ans = 0;
	for (int i=0;i<m;i++) {
		int x=b[i];
		int p = pos[x];
		if (p > mx) {
			int s = qry(p - 1);
			int k = (p - 1) - s;
			ans += 2LL * k + 1;
			mx = p;
		} else {
			ans++;
		}
		upd(p, 1);
	}
	cout << ans << endl;
}

D. Santa's Bot

题意:

等概率随机选一个孩子 \(x\),从 \(x\) 的愿望清单中等概率随机选一个物品 \(y\),等概率随机选一个孩子 \(z\),询问有效的概率。

思路:

首先算出每件物品的抽取概率,直接累加即可,然后分别对每个孩子计算合法的概率,累加即可。

代码

点击查看代码
void solve() {
	cin >> n;
	int s=0;
	for (int i = 1; i <= n; i++) {
		int k;
		cin>>k;
		s+=k;
		for(int j=1;j<=k;j++){
			int x;
			cin>>x;
			a[x]+=qpow(k,mod-2)*qpow(n,mod-2)%mod;
			a[x]%=mod;
			g[i].push_back(x);
		}
	}
	int ans=0;
	for (int i = 1; i <= n; i++) {
		int k=g[i].size();
		for(int j=0;j<k;j++){
			ans+=qpow(n,mod-2)%mod*a[g[i][j]]%mod;
//			cout<<qpow(k,mod-2)<<' '<<qpow(n,mod-2)<<' '<<a[g[i][j]]<<' '<<qpow(s,mod-2)<<endl;
			ans%=mod;
		}
		
	}
	
	cout << ans << endl;
}
posted @ 2026-01-25 18:59  ptlks  阅读(2)  评论(0)    收藏  举报