Codeforces Round 1005 (Div. 2)
A - Brogramming Contest#
题意#
给定长为
的 串 和空串 ,每次操作可以将 的后缀移到 末尾,或将 的后缀移到 末尾。求使得 中全是 且 中全是 的最小操作数
思路#
出现的次数
代码#
点击查看代码
#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#
题意#
定义数组的得分为其长度减去其中不同元素的个数。现给定长为
的正整数数组 ,现在可以至多删除 段的子数组,使得得分最大,若得分相同,取使得数组长度最小的答案。输出 ,不操作输出
思路#
删除只出现一次的元素不会减少得分;删除只出现一次以上的元素总是减少得分。所以要删除只出现 一次的元素的最长子数组
代码#
点击查看代码
#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#
题意#
给定长为
的数组 。初始得分为 ,进行一下操作直到 为空:
假设是 的当前大小。选择一个整数 其中的 ,获得 枚金币,然后:
若,获得 分,删除以 开头的前缀;
若,获得 分,删除以 结尾的后缀;
思路#
要么去掉最左边的正数,要么去掉最右边的负数
代码#
点击查看代码
#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#
题意#
一个史莱姆
可以吃掉它左边的史莱姆 并取代它的位置,如果 。现给定 个史莱姆及质量和 次查询,每次查询在原来的基础上,在最右边放一个质量为 的史莱姆,求这个史莱姆能吃掉几个史莱姆(每次查询独立)
思路#
代码#
点击查看代码
比赛链接 https://mirror.codeforces.com/contest/2064
分类:
CodeForces
标签:
思维
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】