2021/01/24补题(1700+1400)

String Deletion (CodeForces - 1430D )

题意
给定一个只包含0和1的字符串,每次可选择其中任意一位并删掉,删掉后剩下的字符串会自动删除第一段连续相同的前缀,求最多可以操作多少次使字符串变为空串

思路
首先将连续相同的子串分段,因为每次删除一个字符后会自动删除第一段子串,所以要求最多的操作次数就需要每次删除字符时尽量不减少子串的段数,那么可以每次删除字符时优先选择从字符数>=2的子串删除,如果没有就任意删除,不影响最优结果。选择删除的过程用双指针实现

代码

#include <iostream>
#include <algorithm>
#include <string.h>

using namespace std;

const int N = 2e5 + 5;

char s[N];
int a[N];

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		int n, ans = 0, idx = 0;
		scanf("%d", &n);
		scanf("%s", s);
		int m = strlen(s), l = 1;
		for (int i = 1; i < m; i++)	{
			if (s[i] != s[i - 1]) {
				a[idx++] = l;
				l = 0;
			}
			l++;				
		}
		a[idx++] = l;
		int p1 = 0, p2 = 0;
		while (1) {
			while (a[p2] == 1)
				p2++;
			if (p2 >= idx)
				break;
			a[p2]--;
			p1++;
			ans++;
			if (p2 < p1)
				p2 = p1;
		}
		if ((idx - p1) & 1)
			ans += (idx - p1) / 2 + 1;
		else	
			ans += (idx - p1) / 2;
		printf("%d\n", ans);		
	}
	return 0;
}

Flamingoes of Mystery (CodeForces - 1425F)

题意
这是一道交互题,算是第一次做到该种题型,长见识了。
题意就是给一个正整数n,然后有n个盒子,每个盒子都有未知数量的火烈鸟,可以进行n次询问,每次询问给出两个正整数 l 和 r 代表询问从第l个盒子到第r个盒子之间有多少只火烈鸟,n次询问结束后要求输出每个盒子内的火烈鸟数量

思路
思路比较简单,先询问第2个到第n个盒子内火烈鸟的总数,再从第2个开始,每次询问第1个到第 i 个盒子内的火烈鸟的总数,然后利用差分即可求出每个盒子内火烈鸟的数目

代码

#include<bits/stdc++.h>

using namespace std;

int main() {
	int n, x;
	int a[1005];
	scanf("%d", &n);
	printf("? 2 %d\n", n);
	fflush(stdout);
	scanf("%d", &x);
	for (int i = 2; i <= n; i++) {
		printf("? 1 %d\n", i);
		fflush(stdout);
		scanf("%d", &a[i]);
	}
	a[1] = a[n] - x;
	printf("! ");
	for (int i = 1; i <= n; i++)
		printf("%d ", a[i] - a[i - 1]);
	puts("");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值