Codeforces Round 1005 (Div. 2)



A - Brogramming Contest#

题意#

给定长为n01s和空串t,每次操作可以将s的后缀移到t末尾,或将t的后缀移到s末尾。求使得s中全是0t中全是1的最小操作数

思路#

01,10出现的次数

代码#

点击查看代码
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;
#define int long long
typedef pair<int, int> pii;

const int mxn = 1e6 + 5;

void solve()
{
	int n, ans = 0;
	string s;
	cin >> n >> s;
	if (s[0] == '1')
	{
		ans++;
	}
	for (int i = 1; i < s.length(); i++)
	{
		if (s[i] != s[i - 1])
		{
			ans++;
		}
	}
	cout << ans << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int __ = 1;
	cin >> __;
	while (__--)
	{
		solve();
	}

	return 0;
}

B - Variety is Discouraged#

题意#

定义数组的得分为其长度减去其中不同元素的个数。现给定长为n的正整数数组a,现在可以至多删除[l,r]段的子数组,使得得分最大,若得分相同,取使得数组长度最小的答案。输出l,r,不操作输出0

思路#

删除只出现一次的元素不会减少得分;删除只出现一次以上的元素总是减少得分。所以要删除只出现 一次的元素的最长子数组

代码#

点击查看代码
#include<bits/stdc++.h>
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;
#define int long long
typedef pair<int, int> pii;

const int mxn = 1e6 + 5;

void solve()
{
	int n;
	cin >> n;
	vector<int> a(n + 1), cnt(n + 1);
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		cnt[a[i]]++;
	}
	int L = 0, R = 0;
	for (int i = 1; i <= n; i++)
	{
		int l = 0, r = 0;
		if (cnt[a[i]] == 1)
		{
			l = i;
			while (i <= n && cnt[a[i]] == 1)
			{
				r = i;
				i++;
			}
			if (r - l >= R - L)
			{
				L = l;
				R = r;
			}
		}
	}
	if (!L)
	{
		cout << 0 << endl;
	}
	else
	{
		cout << L << " " << R << endl;
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int __ = 1;
	cin >> __;
	while (__--)
	{
		solve();
	}

	return 0;
}

C - Remove the Ends#

题意#

给定长为n的数组a(ai0)。初始得分为0,进行一下操作直到a为空:
假设ma的当前大小。选择一个整数i其中的1im,获得|ai|枚金币,然后:
ai<0,获得|ai|分,删除以ai开头的前缀;
ai>0,获得ai分,删除以ai结尾的后缀;

思路#

要么去掉最左边的正数,要么去掉最右边的负数

代码#

点击查看代码
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;
#define int long long
typedef pair<int, int> pii;

const int mxn = 1e6 + 5;

void solve()
{
	int n;
	cin >> n;
	vector<int> a(n + 1), x(n + 1, 0), y(n + 1, 0);
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	int xx = 0, yy = 0;
	for (int i = 1; i <= n; i++)
	{
		if (a[i] > 0)
		{
			xx += a[i];
			x[i] = xx;
		}
		else
		{
			x[i] = (i == 1 ? 0 : x[i - 1]);
		}
	}
	for (int i = n; i >= 1; i--)
	{
		if (a[i] < 0)
		{
			yy -= a[i];
			y[i] = yy;
		}
		else
		{
			y[i] = (i == n ? 0 : y[i + 1]);
		}
	}
	int ans = 0;
	for (int i = 1; i <= n; i++)
	{
		ans = max(ans, x[i] + y[i]);
	}
	cout << ans << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int __ = 1;
	cin >> __;
	while (__--)
	{
		solve();
	}

	return 0;
}

D - Eating#

题意#

一个史莱姆i可以吃掉它左边的史莱姆j并取代它的位置,如果wiwj。现给定n个史莱姆及质量和q次查询,每次查询在原来的基础上,在最右边放一个质量为x的史莱姆,求这个史莱姆能吃掉几个史莱姆(每次查询独立)

思路#

代码#

点击查看代码



比赛链接 https://mirror.codeforces.com/contest/2064

posted @   _SeiI  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示