首页 > 其他分享 >Codeforces Round 987 (Div. 2)

Codeforces Round 987 (Div. 2)

时间:2024-11-16 19:14:59浏览次数:3  
标签:cout int ll Codeforces cin long 987 tie Div

好不容易的一次CF阳间赛,这次题目普遍较长。

A-Penchick and Modern Monument

题目大意

将一个非递增的序列通过操作某些数(可增大可减小),最终使得序列变成一个非递减的序列,求出最少要操作多少次?

解题思路

这个题也是想了不断时间,而且还提交错误一次,原因就是调试的代码没有修改。

我们可以通过找到出现次数最多的那个数,然后操作其他所有数,这就是最少得操作次数。

Accepted

#include <bits/stdc++.h>
#define pb push_back

using namespace std;
typedef long long ll;
const int N = 50 + 10; 
ll n,m,k;
ll a[N],b[N];

void solve () {
	memset(a,0,sizeof a);
	memset(b,0,sizeof b);
	cin>>n;
	for(int i = 0;i < n;i++) {
		cin>>a[i];
		b[a[i]] ++; 
	}
	int maxLen = 0;
	int index = 0;;
	for(int i = 0;i < n;i++) {
		if(maxLen < b[a[i]]) {
			maxLen = b[a[i]];
		}
	}
	int res = n - maxLen;
	cout<<res<<endl;
}

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

B - Penchick and Satay Sticks

题目大意

给定一个长度为n的序列,这个序列在CF中有特性,就是1~n之间的所有数的任意排列。然后判断是否可以通过交换相邻的两个值,并且这两个值相差为1,最后是否能够得到升序的序列?

解题思路

可以直接通过双指针的一个操作,依次判断是否能交换,如果出现不能交换的情况直接返回错误。

当时想的有点多了,考虑了这些那些的情况,还想了某种排序算法能不能实现,最后以失败告终;还有依次思路正确但是 TLE ,因为我在外层还加了一层循环;但是基于这个序列的特性,就不需要在外层添加一次循环,直接一次遍历即可。

Accepted

#include <bits/stdc++.h>
#define pb push_back

using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
ll n,m,k;
ll a[N];

void solve () {

	cin>>n;
	for(int i = 0; i < n; i++) {
		cin>>a[i];
	}
	for(int j = 1; j < n; j++) {
		if(a[j-1] > a[j]) {
			if(abs(a[j-1] - a[j]) == 1) {
				swap(a[j-1],a[j]);
			} else {
				cout<<"No"<<endl;
				return ;
			}
		}
	}
	cout<<"Yes"<<endl;
}

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

C - Penchick and BBQ Buns

题目大意

这是一道构造排列的题,要求是:

  1. 每个数字如果出现必须是两个以上;
  2. 两个相同数之间的距离一定是一个完全数。

解题思路

这道题属实有点观察规律了,但是想一想还是有技巧的。

序列长度分为奇数和偶数:

  1. 偶数:直接然两个相同的数挨着,并且出现次数恰好为 2 满足第一个条件,这时距离值也是 1 满足第二个条件
  2. 奇数:偶数情况是恰好出现两次的时候,如果为奇数,那么要想能够排列,一定要存在三个完全数 r1、r2、r3,还应满足 r1 = r2 + r3,那么就可以分别为9 、 16 、 25,所以说,要想奇数次数能够排列的时候必须满足 n > 25 ,先思考能否取到 27 ,那么先将 1 填到 位置1 、 10 、 26,然后再两个两个填充其他值,肯定是可以构造的。那么对于大于27的奇数,都可以将其前27进行排列,然后以偶数的方式进行排列即可构造。

Accepted

#include <bits/stdc++.h>
#define pb push_back

using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
ll n,m,k;
int a[N];

void solve () {

	int n;
	cin>>n;
	if(n%2 != 0) {
		if(n >= 27) {
			cout<<"1 2 2 3 3 4 4 5 5 1 6 6 7 7 8 8 9 9 10 10 11 11 12 13 13 1 12 ";
			for(int i = 14;i*2+1 <= n;i++) {
				cout<<i<<" "<<i<<" ";
			}
			cout<<endl;
		} else {
			cout<<-1<<endl;
		}
	} else {
		for(int i = 1; i <= n/2; i++) {
			cout<<i<<" "<<i<<" ";
		}
		cout<<endl;
	}

}

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

D - Penchick and Desert Rabbit

题目大意

有一排树,兔子现在可以按照规则来跳跃:

  1. 向前(下标增大的方向),可以跳跃到任意比当前树低的那一颗;
  2. 向后(下标减小的方向),可以跳跃到任意比当前树高的那一颗。

现在要找出从每一颗树出发,判断可以跳到的最高的树的高度。

解题思路

根据规则可以建立前缀最大数组和后缀最小数组,方便兔子跳到那个可以跳跃的位置;

然后通过遍历前缀和后缀数组,每次比较的都是前缀当前下标的值(a)和后缀下一个下标的值(b),如果 a > b,那就可以接着跳,直到遇见 a <= b 的情况,然后更新当前下标之前的所有下标值为当前位置对应的前缀数组中的值。

Accepted

#include <bits/stdc++.h>
#define pb push_back

using namespace std;
typedef long long ll;
const int N = 5e5+10;
int n,m,k;
int a[N];

void solve () {

	cin>>n;
	for(int i = 1; i <= n; i++) {
		cin>>a[i];
	}
	vector<int> mx(n+1,0),mi(n+2,1e9);
	for(int i = 1; i <= n; i++) mx[i] = max(mx[i-1],a[i]);
	for(int i = n; i >= 0; i--) mi[i] = min(mi[i+1],a[i]);

	for(int i = 1,j = 1; i <= n; i++) {
		if(mx[i] <= mi[i+1]) {
			while(j <= i) {
				cout<<mx[i]<<" ";
				j++;
			}
		}
	}
	cout<<endl;
	

}

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

E 题好像用到了树形DP,但是我题目还没有看懂

标签:cout,int,ll,Codeforces,cin,long,987,tie,Div
From: https://blog.csdn.net/2301_76605150/article/details/143821819

相关文章

  • Codeforces Round 987 (Div. 2)
    训练记录CodeforcesRound987(Div.2)4/6前四题都是简单思维题A.PenchickandModernMonument这个题目最贪心的做法是找到出现最多的数,保留种数字不变,其他按照题目要求改大小就行//Problem:A.PenchickandModernMonument//Contest:Codeforces-CodeforcesRound......
  • CF987 Div2 F 题解
    阶段1考虑我们每次随机删除两个然后询问,若中位数为\(\frac{n}{2},\frac{n}{2}+1\)称被删除的两个为基准数,用\(v_1,v_2\)代表。每次询问得到解的概率约为\(\frac{1}{2}\)。发现基准数一定一个\(<\frac{n}{2}\)一个\(>\frac{n}{2}+1\),且对于一次四个数的询问\(x......
  • C. Penchick and BBQ Buns (python解)-codeforces
    C.PenchickandBBQBuns(python解)-codeforces原题链接:点击传送问题分析:我们需要为给定数量的BBQ包子分配填料,满足以下条件:每种填料必须至少使用两次,或者不使用。任何两个相同填料的包子之间的距离必须是一个完全平方数。思路:为了满足条件,我们可以利用完全平方数的......
  • [Codeforces Round 987 (Div. 2)](https://codeforces.com/contest/2031)解题报告
    CodeforcesRound987(Div.2)太好了是阳间场,我们有救了感觉脑子生锈了qwq,F题做不出来A分析知如果有\(i<j\)且\(a_i>a_j\)的情况出现则\(i\)和\(j\)一定至少改一个。所以答案即为\(n-cnt\),\(cnt\)为众数个数。B发现一个数离自己原本的位置距离不会超过\(1\),有......
  • Codeforces Round 987 (Div. 2)
    CodeforcesRound987(Div.2)总结A常见的套路,将一个序列变为不下降序列所需要改变的值的最小数量,考虑最大能保留多少个,显然是求最长上升子序列,而这题给出的\(a\)序列保证不上升,所以只需要考虑相同长度的一段。#include<iostream>#include<cstdio>#include<cstring>#......
  • Codeforces Round 983 (div 2)
    A.CircuitAlicehasjustcraftedacircuitwith\(n\)lightsand\(2n\)switches.Eachcomponent(alightoraswitch)hastwostates:onoroff.Thelightsandswitchesarearrangedinawaythat:Eachlightisconnectedtoexactlytwoswitches.Ea......
  • Solution - Codeforces 2031F Penchick and Even Medians
    飞快秒掉了,没报名痛失首杀,痛苦。简略题解:考虑先随机二元下标\((x_0,y_0)\)满足删去\((x_0,y_0)\)后查询的中位数还是\(\frac{n}{2},\frac{n}{2}+1\),那么这就说明\(p_{x_0},p_{y_0}\)一定在中位数的两边。那么还剩下的\(n-2\)个下标两两配对成\(\frac{n-2}{......
  • 2024.11.15 Codeforces Round 987(Div. 2)
    Solved:5/6Rank:74比赛链接A.PenchickandModernMonument给定一个不增序列,修改最少的数字使其不降。全都修改为出现次数最多的数即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;voidsolve(){intn;cin>>n;vector<int>a(n);......
  • P9870 [NOIP2023] 双序列拓展 题解
    P9870[NOIP2023]双序列拓展题解NOIP2023T3,特殊性质题。什么是特殊性质题?就是题目给出了你极其神秘的性质,从而引导你想出正解。本篇题解将从部分分的角度,一步步讲述部分分与正解的关系。这样看的话,本题会变得十分简单。\(\text{Task}1∼7,O(Tnm)\)简化题意其实就是要求......
  • 第九章 DIV+CSS布局
    9.1DIV+CSS概述9.1.1认识DIV<div>标签是HTML中的一种块级元素,用于定义文档中的一个分区或区域。它是一个容器,可以包含文本、图像、列表、表格、段落、其他块级元素,甚至是其他<div>元素。<div>标签本身不会在页面上显示任何内容,但它可以作为组织和布局HTML文档的工具9.......