Codeforces Round 950 (Div. 3)(A~D题)

A. Problem Generator

 

思路:暴力模拟,对于每个字母,如果不足m mm,就加入最终答案.

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define N 2000005
#define mod 100003
typedef long long ll;
ll n, m, t, cnt, ans, sum1,sum2, maxx,k;
int x, y;
int a[N], b[N], c[N],dis[N];
bool vis[N];
vector<int>G[N];
typedef pair<int, int>pii;
priority_queue<pii, vector<pii>, greater<pii>>q;
struct node {
	int a, b, c,flag;
}f[N];
int main()
{
	cin >> t;
	void solve();
	while (t--) {
		solve();
	}
	return 0;
}
void solve()
{
	cin >> n >> m;
	ans = 0;
	string s;
	cin >> s;
	map<char, ll>p;
	for (int i = 0; i < s.size(); i++) {
		p[s[i]]++;
	}
	for (int i = 'A'; i <= 'G'; i++) {
		ans += max((ll)0, m - p[i]);
	}
	cout << ans << endl;
}

B. Choosing Cubes

 

思路:

我们只需要检査排完序之后比较在k位置的立方体ak与最喜欢的立方体af,的大小即可,如果ak>af,说明af的位置在k之前,一定会波删;如果ak< af,说明af的位置在k之后,一定不会被删;如果ak= af,检査ak+1,如果ak+1 = af,则有可能被删,否则一定被删。

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define N 2000005
#define mod 100003
typedef long long ll;
ll n, m, t, cnt, ans, sum1,sum2, maxx,k;
int x, y;
int a[N], b[N], c[N],dis[N];
bool vis[N];
vector<int>G[N];
typedef pair<int, int>pii;
priority_queue<pii, vector<pii>, greater<pii>>q;
struct node {
	int a, b, c,flag;
}f[N];
bool cmp(int x, int y) {
	return x > y;
}
int main()
{
	cin >> t;
	void solve();
	while (t--) {
		solve();
	}
	return 0;
}
void solve()
{
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	cnt = a[m];
	sum1 = sum2 = 0;
	sort(a + 1, a + 1 + n, cmp);
	for (int i = 1; i <= n; i++) {
		if (cnt == a[i]) {
			sum1 = i;
			break;
		}
	}
	for (int i = n; i >= 1; i--) {
		if (cnt == a[i]) {
			sum2 = i;
			break;
		}
	}
	if (k < sum1) {
		cout << "NO" << endl;
		return;
	}
	else if(k>=sum2){
		cout << "YES" << endl;
		return;
	}
	else {
		cout << "MAYBE" << endl;
		return;
	}
}

C. Sofia and the Lost Operations

思路:

若最后一个修改数存在于b数组中,那么只需要看这些修改的数能否把a数组中待修改的数全部覆盖即可,否则一定不存在。

实现代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
#define N 2000005
#define mod 7777777
typedef long long ll;
int n, m, t, cnt, ans, sum1,sum, maxx;
int x, y;
int a[N], b[N],d[N];
bool vis[N];
map<int, int>k, dis;
int main()
{
	cin >> t;
	void solve();
	int gcd(int x, int y);
	while (t--) {
		solve();
	}
	return 0;
}
void solve()
{
	cin >> n;
	sum = 0;
	k.clear(), dis.clear();
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	for (int i = 1; i <= n; i++)
		scanf("%d", &b[i]), dis[b[i]]++;
	cin >> m;
	for (int i = 1; i <= m; i++)
		scanf("%d", &d[i]),k[d[i]]++;
	if (!dis[d[m]]) {
		cout << "NO" << "\n";
		return;
	}
	if (dis.find(d[m]) == dis.end()) {
		cout << "NO" << "\n";
		return;
	}
	else {
		bool flag = 1;
		for (int i = 1; i <= n; i++) {
			if (a[i] != b[i]) {
				if (!k[b[i]]) {
					flag = 0;
					break;
				}
				k[b[i]]--;
			}
		}
		if (flag) {
			cout << "YES" << "\n";
			return;
		}
		else {
			cout << "NO" << "\n";
			return;
		}
	}
}

D. GCD-sequence

 

 思路:

将删除前的gcd序列求出来,可以发现若要满足题意,必然需要找到gcd序列中递减的位置,并且删除与之相关的数(要记录前后两个数和他本身)。然后判断删除后的序列能否形成非递减即可。

 

(因为要找到递减的两个数,其原数列是三个连续数决定的,所以要记录者三个数)

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
#define N 2000005
#define mod 7777777
typedef long long ll;
int n, m, t, cnt, ans, num1, num2, num3, maxx;
int x, y;
int a[N], b[N],d[N];
bool vis[N];
map<int, int>k, dis;
vector<int>dp2, dp3;
int gcd(int a, int b) {
	return b > 0 ? gcd(b, a % b) : a;
}
bool judge() {
	for (int i = 1; i <n-2; i++) {
		if (dp3[i] >= dp3[i - 1]) {
			continue;
		}
		else {
			return false;
		}
	}
	return true;
}
int main()
{
	cin >> t;
	void solve();
	while (t--) {
		solve();
	}
	return 0;
}
void solve()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	vector<int>dp1;
	for (int i = 1; i < n; i++) {
		dp1.push_back(gcd(a[i], a[i - 1]));
	}
	num1 = num2 = num3 = -1;
	for (int i = dp1.size()-1; i >= 1; i--) {
		if (dp1[i - 1] > dp1[i]) {
			num1 = i + 1;
			num2 = i;
			num3 = i - 1;
			break;
		}
	}
	if (num1 == -1) {
		cout << "YES" << endl;
		return;
	}
	else {
		dp2.clear(), dp3.clear();
		for (int i = 0; i < n; i++) {
			if (i == num1)
				continue;
			dp2.push_back(a[i]);
		}
		for (int i = 1; i < n-1; i++) {
			dp3.push_back(gcd(dp2[i], dp2[i - 1]));
		}
		if (judge()) {
			cout << "YES" << endl;
			return;
		}
		dp2.clear(), dp3.clear();
		for (int i = 0; i < n; i++) {
			if (i == num2)
				continue;
			dp2.push_back(a[i]);
		}
		for (int i = 1; i < n - 1; i++) {
			dp3.push_back(gcd(dp2[i], dp2[i - 1]));
		}
		if (judge()) {
			cout << "YES" << endl;
			return;
		}
		dp2.clear(), dp3.clear();
		for (int i = 0; i < n; i++) {
			if (i == num3)
				continue;
			dp2.push_back(a[i]);
		}
		for (int i = 1; i < n - 1; i++) {
			dp3.push_back(gcd(dp2[i], dp2[i - 1]));
		}
		if (judge()) {
			cout << "YES" << endl;
			return;
		}
		cout << "NO" << endl;
	}
}

Codeforces Round 894 (Div. 3) 是一个Codeforces举办的比赛,是第894轮的Div. 3级别比赛。它包含了一系列目,其中包括目E. Kolya and Movie Theatre。 根据目描述,E. Kolya and Movie Theatre问要求我们给定两个字符串,通过三种操作来让字符串a等于字符串b。这三种操作分别为:交换a中相同位置的字符、交换a中对称位置的字符、交换b中对称位置的字符。我们需要先进行一次预处理,替换a中的字符,然后进行上述三种操作,最终得到a等于b的结果。我们需要计算预处理操作的次数。 根据引用的讨论,当且仅当b[i]==b[n-i-1]时,如果a[i]!=a[n-i-1],需要进行一次操作;否则不需要操作。所以我们可以遍历字符串b的前半部分,判断对应位置的字符是否与后半部分对称,并统计需要进行操作的次数。 以上就是Codeforces Round 894 (Div. 3)的简要说明和目E. Kolya and Movie Theatre的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Codeforces Round #498 (Div. 3) (A+B+C+D+E+F)](https://blog.csdn.net/qq_46030630/article/details/108804114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Codeforces Round 894 (Div. 3)A~E解](https://blog.csdn.net/gyeolhada/article/details/132491891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值