首页 > 其他分享 >Codeforces Round 998 (Div. 3)(部分题解)

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

时间:2025-01-22 21:30:08浏览次数:3  
标签:cin int 题解 Codeforces long 998 solve vi define

补题链接

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;
}

标签:cin,int,题解,Codeforces,long,998,solve,vi,define
From: https://blog.csdn.net/wirepuller_king/article/details/145288479

相关文章

  • 题解:洛谷 P1803 凌乱的yyy / 线段覆盖
    题目https://www.luogu.com.cn/problem/P1803题目大意给定  条线段,第  条线段放在位置 ,现在你需要从这些线段中拿出一些,使得剩下的线段不会重叠。思路考虑贪心。可以发现,按照左端点从小到大排序毫无意义(虽然样例能过)。因此考虑按右端点从小到大排序。然后尽量多放......
  • AtCoder ABC326C 题解
    题目链接问题陈述Takahashi在数字线上放置了\(N\)个礼物。第\(i\)个礼物放置在坐标\(A_i\)处。您将在数轴上选择长度为\(M\)的半开区间\([x,x+M)\),并获得其中包含的所有礼物。更具体地说,你根据以下程序获得礼物。首先,选择一个实数\(x\)。然后,获取坐标满足\(......
  • C. Game of Mathletes(题解)
    首先Alice擦一个数a,然后Bob再擦一个数b,只有当a+b=k的时候才可以得分,Alice想要最小化分数而Bob想要最大化分数,所以如果给定的数中存在两个数的和为k,那么当Alice擦掉其中一个的时候Bob一定会擦掉另一个来得分,而且题目给定的数组长度为偶数,所以我们只需要运用双指针的思想找到数组......
  • 常见问题解决 --- 引用的账户当前已锁定,且可能无法登录什么意思
     当你在尝试登录Windows系统时,看到错误提示“引用的账户当前已锁定,且可能无法登录”,这意味着你使用的用户账户由于多次输入错误的密码而被系统锁定。这是一种安全机制,旨在防止暴力破解或未经授权的访问。原因分析1.多次输入错误密码:如果连续多次输入错误的密码,系统会自......
  • 题解:P11600 『Fwb』流星の陨落
    『Fwb』流星の陨落题目描述流星雨来了!当然,这场流星雨确确实实是Fwb设计的。Fwb在天空中放置了许多的流星,同时也在地面上放置了许多的烟花。当流星和烟花发生碰撞时,就会出现美丽而独特的风景。由于方便控制流星雨的发射,流星的发射是有规律的,这个发射的规律叫做流星间隔。我......
  • 「CF1437F」Emotional Fishermen 题解
    小水题一道Description有n\((n\le5000)\)个渔民,每个渔民钓了一条重\(a_i\)的鱼,渔民按任意顺序展示他们的鱼。若当前渔民的鱼的重量为\(x\),之前展示过的鱼的最大重量\(y\)。一个排列满足条件当且仅当对于每个\(x\),满足\(2y\lex\)或\(2x\ley\)。问有多少个排列满......
  • 「CF618F」Double Knapsack 题解
    只能说。。。Description给你两个可重集 \(A,B\),\(A,B\) 的元素个数都为 \(n\),它们中每个元素的大小 \(x\in[1,n]\)。请你分别找出 \(A,B\) 的子集,使得它们中的元素之和相等。\(n\leq10^6\)。Solution将找子集强化成找子段(不知道怎么想的),令\(sa_{n}\)表示\(A\)......
  • 「CF1854D」Michael and Hotel 题解
    逆天交互题、、、我只能说阈值分治赛高!!!Description有一个有 \(n\) 个点的内向基环树森林,zlsim位于 \(1\) 号节点,请你通过以下操作求出哪些节点(包括 )可以通过从这两点开始沿边行走若干步汇至一点。给出两个参数 \(u,k\) 和点集 \(S\),询问是否能够通过从 \(u\) 出......
  • P9678 题解
    题意给定一棵\(n\)个点的树\(T\),边有边权。现在有\(q\)组询问,每组询问给出\(l,r\),求出:\[\min_{l\lei<j\ler}\operatorname{dist}(i,j)\]\(n\le2\times10^5\),\(q\le10^6\),\(1\lew\le10^9\)。由于与路径长度有关,所以考虑点分治或者LCA。由于笔......
  • IAEPC Preliminary Contest (Codeforces Round 999, Div. 1 + Div. 2)
    B.KevinandGeometryvector的删除,无论是删除单个元素还是区间,一定是传入迭代器,而且区间一定是左闭右开区间点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ ios::sync_with_stdio(false); cin.tie(0); intT; cin>>T; while(T--) { int......