Codeforces Round #829 (Div. 2)A.B.C1.D

博客围绕Codeforces上的几道算法题展开,包括A. Technical Support、B. Kevin and Permutation等。针对每道题给出题目链接、题面、题意,详细阐述解题思路,如判断对话框问题是否都有回答、构造数列使差值绝对值最小等,并给出相应代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A. Technical Support

题目链接:

Problem - A - Codeforces

题面:

题意:

有一段对话,Q是询问,A是回答,对于每个问题,你可以回答一句或者多句,你也可以后面回答前面的问题,问这个对话框是否每个问题都有回答

思路:

对于每次回答,我们优先假设是没有回答过的询问的回答,然后判断是否每个问题都有回答即可

代码:

#include<bits/stdc++.h>
using namespace std;

int main(){
	int t;
	cin >> t;
	while(t--){
		int n;
		string s;
		cin >> n >> s;
		int ans = 0, cnt = 0;
		for(int i = 0; i < n; i++){
			if(s[i] == 'Q'){
				ans++;
			}else{
				if(ans > 0){
					ans--;
				}
			}
		}
		if(ans == 0){
			cout << "Yes" << endl;
		}else{
			cout << "No" << endl;
		}
	}
	return 0;
} 

B. Kevin and Permutation

题目链接:

Problem - B - Codeforces

题面:

题意:

有一个长度为n的数列,由1-n构成,问如何构造这个数列,使两两之间的差值的绝对值的最小值最大

思路:

长度为n的数列,两两之间的差值的绝对值的最小值的最大情况为n/2

代码:

#include<bits/stdc++.h>
using namespace std;


int main(){
	int t;
	cin >> t;
	while(t--){
		int n;
		cin >> n;
		int ans = n / 2;
		bool f = 0;
		for(int i = 1; i <= ans; i++){
			if(f){
				cout << " ";
			}
			f = 1;
			cout << i + ans << " " << i;
		}
		if(n & 1){
			if(f){
				cout << " ";
			}
			cout << n;
		}
		cout << endl;
	} 
	return 0;
}

C1. Make Nonzero Sum (easy version)

题目链接:

Problem - C1 - Codeforces

题面:

题意:

有一个长度为n的数列,你可以把它分成很多段,每个段的价值为奇数位加上偶数位的相反数的和,分成多段后每段的价值和是否能为0

思路:

当前位和后一位相同的时候,把这两个放一起就能为0,如果相反的情况,那么分开放和也为0,那么两两配对即可,所以如果n是奇数,一定不可能,偶数就判断能否放一起即可

代码:

#include<bits/stdc++.h>
using namespace std;

int arr[200005];
vector<pair<int, int>> ve;

int main(){
	int t;
	cin >> t;
	while(t--){
		ve.clear();
		int n;
		cin >> n;
		for(int i = 1; i <= n; i++){
			cin >> arr[i];
		}
		if(n & 1){
			cout << -1 << endl;
			continue;
		}
		for(int i = 1; i <= n; i++){
			if(arr[i] - arr[i + 1] == 0){
				ve.push_back({i, i + 1});
			}else{
				ve.push_back({i, i});
				ve.push_back({i + 1, i + 1});
			}
			i++;
		}
		cout << ve.size() << endl;
		for(int i = 0; i < ve.size(); i++){
			cout << ve[i].first << " " << ve[i].second << endl;
		}
	}
	return 0;
}

D. Factorial Divisibility

题目链接:

Problem - D - Codeforces

题面:

题意:

有一个长度为n的数组,问这个数组每个数的阶乘和是不是x阶乘的倍数

思路:

对于ai >= x的情况,这个一定是x的倍数

ai<x的情况,我们需要记录每个数出现的个数

然后尽量的把i!的阶乘变成(i + 1)!,如果i出现的个数是(i+1),那么就可以把i的个数减(i+1),i+1的个数++,看能不能把小于x的数,全转化为x即可

代码:

#include<bits/stdc++.h>
using namespace std;

int num[500005];

int main(){
	int n, x;
	cin >> n >> x;	
	int a;
	for(int i = 0; i < n; i++){
		cin >> a;
		if(a < x){
			num[a]++;
		}
	}
	for(int i = 1; i < x; i++){
		if(num[i] > i){
			num[i + 1] += num[i] / (i + 1);
			num[i] = num[i] % (i + 1);
		}
	}
	bool f = 0;
	for(int i = 1; i < x; i++){
		if(num[i] != 0){
			f = 1;
			break;
		}
	}
	if(!f){
		cout << "Yes" << endl;
	}else{
		cout << "No" << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值