首页 > 其他分享 >Codeforces Round 983 (Div. 2) 题解

Codeforces Round 983 (Div. 2) 题解

时间:2024-11-02 20:08:43浏览次数:5  
标签:return 题意 int 题解 Codeforces while solve 983 Div

Codeforces Round 983 (Div. 2) 题解

Codeforces Round 983 (Div. 2)

Problem - A - Codeforces

解题思路

  • 考虑贪心,每个灯连两个开关,即两个开的灯可以关闭一盏灯,则灯数最多则尽可能让两个开关都开的灯尽量少,灯数最少则反之
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int a[110];
void solve(){
	int n;cin>>n;
	int cnt0=0,cnt1=0;
	for(int i=1;i<=2*n;i++){
		int x;cin>>x;
		if(x==1) cnt1++;
		else cnt0++;
	}
	int ans1=0,ans2=0;
	if(cnt1<=n) ans1=cnt1;
	else ans1=n-(cnt1-n);
	ans2=cnt1%2;
	cout<<ans2<<" "<<ans1<<endl;
}
int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T;cin>>T;
	while(T--) solve();
	return 0;
}

Problem - B - Codeforces

解题思路

  • 构造,我们可以考虑这样一个构造,将数组分成三段,第k个数为中间一段,并且令k为中位数,这样的话,加上前后的数组则满足题目意思
  • 注意特判n=1时直接输出1,k=1或k=n时输出-1
  • k要分奇偶讨论,如果k为偶数则[1,k-1],[k,k],[k+1,n];如果k为奇数则[1,k-2],[k-1,k+1],[k+2,n]
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=2e5+10;
int a[N];
void solve(){
	int n,k;cin>>n>>k;
	if(n==1){
		cout<<1<<endl;
		cout<<1<<endl;
		return;
	}
	if(k==1 || k==n){
		cout<<-1<<endl;
		return;
	}
	if(k%2==0){
		cout<<3<<endl;
		cout<<1<<" "<<k<<" "<<k+1<<endl;
	}
	else{
		cout<<3<<endl;
		cout<<1<<" "<<k-1<<" "<<k+2<<endl;
		return;
	}
}
int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T;cin>>T;
	while(T--) solve();
	return 0;
}

Problem - C - Codeforces

解题思路

  • 要满足a[i]+a[j]>a[k],那么假如我们让最小的两个值相加能大于数组里的最大值,则一定可以满足,不妨排序一下,我们二分第一个大于a[1]+a[2]的位置id,则我们只需更改n-id+1个数则可以满足题意
  • 但上述不一定是最少的操作次数,因为我们也可以通过更改a[1]或者a[2]使得满足题意思,如果我们更改a[1],a[2]的值,我们一定能让其中一个数与其他数的和都能满足题意
  • 所以我们可以将题意简化成,我们每次删除一个数字,使得所有的a[i]+a[j]>a[k],(因为我们最多对一个数操作一次赋值,并且他与其他数的和一定满足题意)
  • 所以枚举a[i],二分第一个大于a[i]+a[i+1]的位置id,ans即为(i-1)+(n-id+1)
  • 时间复杂度为O(nlogn)
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
void solve(){
	int n;cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1);
	int ans=1e9;
	for(int i=1;i<=n-1;i++){
		int x=a[i]+a[i+1];
		int id=lower_bound(a+1,a+n+1,x)-a;
		int tmp=n-id+1+i-1;
	//	cout<<x<<" "<<id<<" "<<tmp<<endl;
		ans=min(ans,tmp);
	}
	cout<<ans<<endl;
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T;cin>>T;
	while(T--) solve();
	return 0;
}

Problem - D - Codeforces

解题思路

  • 感觉难点在于读题,题目的三条性质其实表示这是一颗层序遍历的树,除0点外每一个节点只有一个孩子
  • 我们可以通过一个队列进行模拟询问,只要找出节点1的孩子之后剩下的就依次询问即可
  • 详情见代码部分
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int fa[N];
int ask(int x,int y){
	cout<<"? "<<x<<" "<<y<<endl;
	int tmp;cin>>tmp;
	return tmp;
}
void solve(){
	int n;cin>>n;
	fa[1]=0;
	queue<int> q;
	q.push(1);
	int now=2;
	while(now<n){
		int tmp=ask(1,now);
		if(tmp==1){
			fa[now]=0;
			q.push(now);
			now++;
		}
		else if(tmp==0){
			fa[now]=1;
			q.pop();//1出队
			q.push(now);
			now++;
			break;
		}
	}
	while(now<n){
		int t=q.front();
		q.pop();
		int tmp=ask(t,now);
		if(tmp==0){
			fa[now]=t;
			q.push(now);
			now++;
		}
	}
	cout<<"! ";
	for(int i=1;i<n;i++) cout<<fa[i]<<" ";
	cout<<endl;
}
int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T;cin>>T;
	while(T--) solve();
	return 0;
}

标签:return,题意,int,题解,Codeforces,while,solve,983,Div
From: https://www.cnblogs.com/personaowl/p/18522400

相关文章

  • Codeforces Round 983 (Div. 2) A~D
    链接:CodeforcesRound983(Div.2)A:Circuit大意:    n个灯,每个灯连两个开关,每个开关只连一个灯,每个灯对应的两个开关如果异或为1就亮    现给定开关状态,求灯亮的最大和最小数量思路:    求最小数量的话,将开关为1的尽量组一起,我们发现,如果开关为1的......
  • 线段树也能是 Trie 树 题解
    题意简述给定一个长为\(n=2^k\)的序列\(\{a_0,\ldots,a_{n-1}\}\),你需要使用数据结构维护它,支持\(m\)次以下操作:单点加:\(a_x\getsa_x+y\);区间查:\(\sum\limits_{i=l}^ra_i\);全局下标与:\(a'_{i\operatorname{and}x}\getsa_{i}\),即把\(a_i\)累加到......
  • Codeforces Round 983 Div2 A-C
    目录A-CircuitB-MediansC-TrinityD-总结与思考A-Circuit题目概述Alice刚刚制作了一个包含n个灯和2n个开关的电路。每个组件(灯或开关)有两种状态:开或关。灯和开关的排列方式如下:每个灯连接恰好两个开关。每个开关连接恰好一个灯。但并不知道每个开关......
  • 动态规划题解报告
    [APIO2016]划艇注意到\(n\le500\)考虑\(O(n^3)\)的做法。值域小的做法比较显然,值域比较大,考虑离散化(将\(b_i+1\)然后限制变为\([a_i,b_i+1)\))。设\(f_{i,j}\)表示考虑前\(i\)个,\(i\)选择\(j\)的方案数。发现由于离散化了很难转移\(f_{k,j}\(k<i)\)的情况......
  • Codeforces Round 983 (Div. 2)
    A最坏的情况就是所有开着的开关尽可能配对最好的情况就是所有开着的开关尽可能不配对#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefpair<int,int>PII;constintN=1e6+10;constintmod=998244353;constintINF=0x3f3f3f3f;constllI......
  • 关于Copilot出现:You don`t have access to Github Copilot .....的问题解决方案
    前面如何如何配置,以及如何如何上传学生证资料等我这里不赘述badendinghappyending出现这个界面这个问题就是set_up不是很完全,设置一下就行disable改为enable等这样再回去IDE,就可以正常使用了......
  • 牛客周赛 Round 65 题解
    牛客周赛Round65牛客周赛Round65A-超市_牛客周赛Round65#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;voidsolve(){ intn,a,b;cin>>n>>a>>b; intans=0; for(inti=0;i<=100;i++){ for(intj=0;j<=100;j++){......
  • P3780 苹果树 题解
    传送门夏天近了,又到了恋爱的季节,小Q家门前的苹果树上结满了红红圆圆的苹果。这株苹果树是一个有着\(n\)个结点的有根树,其中结点被依次编号为\(1\)至\(n\)。\(1\)号结点为根,其余每一个结点的父结点一定是某个编号较小的结点。每一个结点上都有一些苹果,第\(i\)个结点上有\(a_i(a_......
  • 【轰炸题解】
    轰炸题目描述“我该怎么办?”飞行员klux向你求助。事实上,klux面对的是一个很简单的问题,但是他实在太菜了。klux要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux遇到了抵抗,所以klux只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法......
  • Codeforces Round 983 div2 个人题解(A~D)
    CodeforcesRound983div2个人题解(A~D)Dashboard-CodeforcesRound983(Div.2)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#include<cassert>#include<cmath>#in......