Codeforces Round 998 (Div. 3)(部分题解)

补题链接

A. Fibonacciness

思路:了解清楚题意,求得是最大的斐波那契的度,数组只有5个数(最多度为3),能列出其对应的式子

a_3 = a_1+a_2 或 a_3=a_4-a_2a_3=a_5-a_4

#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
    int n, m, k;
    vector<int> a(4);
    set<int> s;
    for (int i= 0; i<4; i++) cin >> a[i];
    s.insert(a[0]+a[1]);
    s.insert(a[2]-a[1]);
    s.insert(a[3]-a[2]);
    cout << 4-s.size() << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    
    return 0;
}

B. Farmer John's Card Game

 思路:

我的思路偏向于暴力一点,先排好序,并记录位置,再遍历跑一边n*m检查有没有不符合条件的。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>
#define vvi vector<vi>

void solve()
{
	int n, m, k;
	cin >> n >> m;
	vvi a(n+1, vi(m+1));
	map<int, int> mp;
	for (int i = 1; i <= n; ++i){
		for (int j = 1; j <= m; ++j){
			cin >> a[i][j];
		}
		sort(a[i].begin()+1, a[i].end());
		mp[a[i][1]] = i;
	}
	sort(a.begin()+1, a.end(), [](vi &x, vi &y){
		return x[1] < y[1];
	});
	int flag = 0;
	int last = -1;
	for (int i = 1; i <= m; ++i){
		for (int j = 1; j <= n; ++j){
			if (a[j][i] < last) {
				flag = 1;
				break;
			}
			else last = a[j][i];
		}
		if (flag) break;
	}
	if (flag) cout << -1 << endl;
	else {
		for (int i = 1; i <= n; ++i){
			cout << mp[a[i][1]] << " \n"[i == n];
		}
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	int t = 1;
	cin >> t;
	while (t--)
	{
		solve();
	}
	
	return 0;
}

题解的思路会巧一点不用重复遍历。

附上关键代码:

for (vll &we : ve) {
        for (ll &i : we) cin >> i;
        ll minN = *min_element(we.begin(), we.end());
        if (minN < n) p[minN] = c++;
        val &= minN < n;
        sort(we.begin(), we.end());
        ll last = we[0]-n;
        for (ll i : we) {
            val &= last+n == i;
            last = i;
        }
    }

C. Game of Mathletes

思路:

记录数字出现的次数,枚举k的一半,(k为偶数特判一下)取mp[i],mp[k-i]的较小值。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>

void solve()
{
	int n, m, k;
	cin >> n >> k;
	vi a(n);
	map<int, int> mp;
	for (int i = 0; i < n; i++){
		cin >> a[i];
		mp[a[i]]++;
	}
	int ans = 0;
	for (int i = 1; i<=k/2; i++){
		if (k % 2 ==0 && i == k/2) ans += mp[i]/2;
		else ans += min(mp[i], mp[k-i]);
		
	}
	cout << ans << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	int t = 1;
	cin >> t;
	while (t--)
	{
		solve();
	}
	
	return 0;
}

D. Subtract Min Sort

思路:

从头开始遍历,如果a[i-1]>a[i]就不成立,

否则a[i]和a[i-1]都同时减去min(a[i-1],a[i])

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>
#define endl '\n'
void solve()
{
	int n, m, k;
	cin >> n;
	vi a(n);
	int flag = 0;
	for (int i = 0; i < n; i++) cin >> a[i];
	for (int i = 1; i<n; i++){
		if (a[i-1] > a[i]) {
			flag = 1;
			break;
		}
		else {
			int mi = min(a[i-1], a[i]);
			a[i-1] -= mi;
			a[i]-=mi;
		}
	}
	if (flag) cout << "NO" << endl;
	else cout << "YES" << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	int t = 1;
	cin >> t;
	while (t--)
	{
		solve();
	}
	
	return 0;
}

### 关于Codeforces Round 925 (Div. 3) 对于希望参加或回顾Codeforces Round 925 (Div. 3)的比赛者而言,理解该轮次的具体题目及其解析至关重要。然而,在提供的参考资料中并未直接提及关于此特定轮次的信息[^1]。 通常情况下,Codeforces的每一场比赛都包含了不同难度级别的若干问题,旨在测试参赛者的编程技巧以及解决问题的能力。以类似的Div. 3赛事为例,比赛往往设计了适合较低评级选手挑战的任务,鼓励更多新手参与到竞争当中来,并提供了一个良好的平台让这些新人们能够逐步提升自我[^2]。 针对想要深入了解Codeforces Round 925 (Div. 3),建议访问官方Codeforces网站查看具体公告页面获取最准确的比赛详情和官方题解。此外,社区论坛也是寻找非正式讨论和个人见解的好地方,许多经验丰富的参与者会在赛后分享自己对各道试题的看法和技术细节分析[^3]。 为了准备这类竞赛,练习过往相似类型的题目是非常有益的做法之一。例如,在其他几场提到的比赛中所涉及的一些基础概念和技术点可能会重复出现,因此熟悉它们有助于更好地应对未来的考验[^4]。 ```python # 示例代码用于说明如何查找并打印指定范围内的素数, # 这种技能可能在某些算法竞赛题目中有用。 def find_primes(n): primes = [] is_prime = [True] * (n + 1) p = 2 while p ** 2 <= n: if is_prime[p]: for i in range(p**2, n + 1, p): is_prime[i] = False p += 1 for p in range(2, n + 1): if is_prime[p]: primes.append(p) return primes print(find_primes(30)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wirepuller_king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值