Codeforces Hello 2023

第一题

条件等价于最终的结果中必须存在子串 RLRL ,所以只要原字符串中存在 LRLRRLRL 则本题有解,若先搜索到 LRLR 则输出其中 LL 的下标+1 的值,若先搜索到 RLRL 则输出 00,若字符串中只有 LLRR 则输出 1-1

第二题

题意:给定一个数组长度 nn ,求是否存在满足数组中各元素之和等于任意两相邻元素之和的数组,若存在则举例

注:2n10002 \leq n \leq 1000

nn 为偶数,则必可构造出该数组:[1,1,1,1,...][1, -1, 1, -1, ...]

nn 为奇数,则分两种情况:

  1. n=3n = 3 ,则无解
  2. nn 为其他任意奇数,则必可构造出数组:[(n/21),n/2,(n/21),n/2,...][-(n/2-1), n/2,-(n/2-1), n/2,...]

第三题

题意:给定长度为 nn 的数组 aa ,给定 mm ,有一操作可使数组 aa 中某一元素取负,即 ai=aia_{i} = -a_{i} ,求使 a[1]+a[2]+...+a[m]a[1] + a[2] + ... + a[m] 为最小前缀和的操作数

即对于给定的 m(1mn)m(1 \leq m \leq n) ,都有任何一个 k(1km)k(1 \leq k \leq m) ,使 a[1]+a[2]+a[3]+...+a[k]a[1]+a[2]+a[3]+...+a[m]a[1]+a[2]+a[3]+...+a[k] \geq a[1]+a[2]+a[3]+...+a[m]

我们定义 [L,R]=a[L]+a[L+1]+...+a[R1]+a[R][L, R] = a[L] + a[L + 1] + ... + a[R - 1] + a[R]

分类讨论一下:

  • kmk \leq m 时,
    • a[1,k]a[1,m]a[1,k]+a[k+1,m]>=a[1,m]a[k+1,m]0a[1, k] \geq a[1, m] \Rightarrow a[1, k] + a[k + 1, m] >= a[1, m] \Rightarrow a[k + 1, m] \leq 0
    • 可以得到,任意的 i[2,m]i \in [2, m] 都有 a[i,m]0a[i, m] \leq 0
  • k>mk > m 时,
    • a[1,k]a[1,m]a[1,m]+a[m+1,k]a[1,m]a[m+1,k]0a[1, k] \geq a[1, m] \Rightarrow a[1, m] + a[m + 1, k] \geq a[1, m] \Rightarrow a[m + 1, k] \geq 0
    • 可以得到,任意的 i[m+1,n]i \in [m + 1, n] 都有 a[m+1,i]0a[m + 1, i] \geq 0

所以我们贪心的考虑即可

代码:

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;
}

第四题(未解决)

贪心+数据结构

补题网址:https://zhuanlan.zhihu.com/p/596398202

全部评论

相关推荐

面试拷打成m:我感觉他说的挺对的,感觉我找不到工作也要去送外卖了,至少饿不死
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务