Codeforces Hello 2023
第一题
条件等价于最终的结果中必须存在子串 ,所以只要原字符串中存在 或 则本题有解,若先搜索到 则输出其中 的下标+1 的值,若先搜索到 则输出 ,若字符串中只有 或 则输出 。
第二题
题意:给定一个数组长度 ,求是否存在满足数组中各元素之和等于任意两相邻元素之和的数组,若存在则举例
注:
若 为偶数,则必可构造出该数组:
若 为奇数,则分两种情况:
- 若 ,则无解
- 若 为其他任意奇数,则必可构造出数组:
第三题
题意:给定长度为 的数组 ,给定 ,有一操作可使数组 中某一元素取负,即 ,求使 为最小前缀和的操作数
即对于给定的 ,都有任何一个 ,使
我们定义
分类讨论一下:
- 时,
- 可以得到,任意的 都有
- 时,
- 可以得到,任意的 都有
所以我们贪心的考虑即可
代码:
LL T;
cin >> T;
while (T --)
{
LL n, m;
cin >> n >> m;
multiset<LL> st;
for (int i = 1;i <= n;i ++) cin >> a[i];
LL sum = 0, res = 0;
for (int i = m;i >= 2;i --) // 倒序
{
sum += a[i];
st.insert(a[i]);
while (sum > 0) // 贪心的把最大的数取负
{
LL t = *(prev(st.end()));
sum -= t;
sum += -1 * t;
st.erase(prev(st.end()));
res ++;
}
}
st.clear();
sum = 0;
for (int i = m + 1;i <= n;i ++)
{
sum += a[i];
st.insert(a[i]);
while (sum < 0) // 贪心的把最小的数取负
{
LL t = *(st.begin());
sum -= t;
sum += -1 * t;
st.erase(st.begin());
res ++;
}
}
cout << res << endl;
}
第四题(未解决)
贪心+数据结构