Codeforces Round #410 (Div. 2)

本文提供了四道算法竞赛题目的详细解答过程,包括字符串匹配、序列处理、数学问题及组合优化等,通过代码实例展示了高效的解决策略。

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

A

这题一定要且只能修改一个字符

#include <cstdio>
#include <cstring>
#include <cmath>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <utility>

using namespace std;
#define LL long long
#define pb push_back
#define pill pair<int, int>
#define mk make_pair
#define mst(a, x)	memset(a, x, sizeof(a))
#define REP(i, x, n)	for(int i = x; i < n; ++i)
const int qq = 1e5 + 10;
int num[qq];
int n, m, k;
char st[20];

int main(){
	scanf("%s", st);
	int len = strlen(st);
	int ans = 0;
	int l = 0, r = strlen(st) - 1;
	while(l < r){
		if(st[l] != st[r])	ans++;
		l++, r--;
	}
	if(ans == 1)	puts("YES");
	else if(ans == 0 && len % 2 == 1)	puts("YES");
	else	puts("NO");
	return 0;
}




B

模拟模拟、

只能删掉字符串左边第一个,然后放到最后面。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <utility>

using namespace std;
#define LL long long
#define pb push_back
#define pill pair<int, int>
#define mk make_pair
#define mst(a, x)	memset(a, x, sizeof(a))
#define REP(i, x, n)	for(int i = x; i < n; ++i)
const int qq = 1e5 + 10;
int n, m, k;
string st[55];
int Calcul(string x, string y){
        int cnt = 0;
        int len = (int)x.size();
		while(x != y){
			char ch = y[0];
			y.erase(y.begin());
			y += ch;
			cnt++;
			if(cnt >= len)	return len;
		}
	return cnt;
}

int main(){
	cin >> n;
	for(int i = 0; i < n; ++i){
		cin >> st[i];
	}
	int minx = 1e9;
	string x = st[0];
	int len = (int)x.size();
	for(int i = 0; i < len; ++i){
		int num = 0;
		for(int j = 0; j < n; ++j){
			string y = st[j];
			int cnt = Calcul(x, y);
			if(cnt >= len){
                puts("-1");
                return 0;
			}
			num += cnt;
		}
		minx = min(minx, num);
		char ch = x[0];
		x.erase(x.begin());
		x += ch;
	}
	cout << minx << endl;
	return 0;
}






C

(a, b) -> (a - b, a + b) -> (-2b, 2a)

很显然这个式子成立肯定就没有NO

因为若干偶数的gcd 一定是 大于1的,这个很容易想到、

最终结果就是把所有数都变成偶数

如果是两个奇数只需要一次变换,奇偶需要两次

#include <cstdio>
#include <cstring>
#include <cmath>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <utility>

using namespace std;
#define LL long long
#define pb push_back
#define pill pair<int, int>
#define mk make_pair
#define mst(a, x)	memset(a, x, sizeof(a))
#define REP(i, x, n)	for(int i = x; i < n; ++i)
const int qq = 1e5 + 10;
LL num[qq];
int p[qq];
int n;
LL gcd(LL a, LL b){
	return b == 0 ? a : gcd(b, a % b);
}

int main(){
	scanf("%d", &n);
	LL t = 0;
	for(int i = 0; i < n; ++i){
		scanf("%lld", num + i);
		if(i == 0)	t = num[i];
		else t = gcd(t, num[i]);
		num[i] = num[i] % 2;
	}
	if(t != 1){
		printf("YES\n0\n");
		return 0;
	}
	int ans = 0;
	for(int i = 0; i < n; ++i){
		if(num[i] == 1){
			if(i + 1 < n){
				if(num[i + 1] == 1){
					ans += 1;
				}
				else{
					ans += 2;
				}
				num[i] = num[i + 1] = 0;
			}else{
				ans += 2;
			}
		}
	}
	printf("YES\n%d\n", ans);
	return 0;
}



D

对于一个乱序的系列a, (序列长度为偶数)对于每两个a[i] a[i + 1], 我们如果都选择其中较大的一个,那么最终选出来的数的两倍一定大于原数组的和,奇数情况下就是随便选一个数,然后剩下的数就是偶数情况。

这题的话我们讲每一个a[i], b[i], i看成一个整体,首先我们对a数组大小排各序,我们拿掉排序结果最大的那一组,对剩下的进行b[i] b[i + 1]进行取最大的即可。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <utility>

using namespace std;
#define LL long long
#define pb push_back
#define pill pair<int, int>
#define mk make_pair
#define mst(a, x)	memset(a, x, sizeof(a))
#define REP(i, x, n)	for(int i = x; i < n; ++i)
const int qq = 1e5 + 10;
int n, m, k;
tuple<int, int, int> t[qq];
int x[qq], y[qq];
int id[qq];

int main(){
    scanf("%d", &n);
    for(int i = 0; i < n; ++i){
        cin >> x[i];
    }
    for(int i = 0; i < n; ++i){
        cin >> y[i];
    }
    for(int i = 0; i < n; ++i){
        t[i] = make_tuple(x[i], y[i], i + 1);
    }
    sort(t, t + n);
    int cnt = 0;
    int a, b, c;
    tie(a, b, c) = t[n - 1];
    id[cnt++] = c;
    int d, e, f;
    for(int i = n - 2; i >= 0; i -= 2){
        tie(a, b, c) = t[i];
        tie(d, e, f) = t[i - 1];
        if(b > e){
            id[cnt++] = c;
        }else{
            id[cnt++] = f;
        }
    }
    cout << cnt << endl;
    for(int i = 0; i < cnt; ++i){
        cout << id[i] << " ";
    }
    cout << endl;
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值