Codeforces Round 1005 (Div. 2)
A - Brogramming Contest
题意
给定长为\(n\)的\(01\)串\(s\)和空串\(t\),每次操作可以将\(s\)的后缀移到\(t\)末尾,或将\(t\)的后缀移到\(s\)末尾。求使得\(s\)中全是\(0\)且\(t\)中全是\(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(a_i\ne 0)\)。初始得分为\(0\),进行一下操作直到\(a\)为空:
假设\(m\)是\(a\)的当前大小。选择一个整数\(i\)其中的\(1≤i≤m\),获得\(|a_i|\)枚金币,然后:
若\(a_i<0\),获得\(|a_i|\)分,删除以\(a_i\)开头的前缀;
若\(a_i>0\),获得\(a_i\)分,删除以\(a_i\)结尾的后缀;
思路
要么去掉最左边的正数,要么去掉最右边的负数
代码
点击查看代码
#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\)并取代它的位置,如果\(w_i\ge w_j\)。现给定\(n\)个史莱姆及质量和\(q\)次查询,每次查询在原来的基础上,在最右边放一个质量为\(x\)的史莱姆,求这个史莱姆能吃掉几个史莱姆(每次查询独立)
思路
代码
点击查看代码

                
            
        
浙公网安备 33010602011771号