Educational Codeforces Round 111 选做

施工中

A. Find The Array

直接 \(1+3+5+\dots\) 找到第一个比其大的数,显然可以通过调整使其与之相等。

#include<bits/stdc++.h>
int main()
{
	int T; scanf("%d",&T);
	while(T--)
	{
		int s,x=0;
		scanf("%d",&s);
		for(int i=1,sum=0;sum<s;sum+=i,i+=2,++x);
		printf("%d\n",x); 
	}
}

B. Maximum Cost Deletion

\(a\) 不用管直接乘 \(n\) 即可;如果 \(b>0\) 则需删除次数最大,一个一个删即可;\(b<0\) 可先把连续的 \(0/1\) 删掉最后一把删除剩余的 \(1/0\),次数为 \(\lfloor\frac{x}{2}\rfloor+1\)\(x\) 为连续段个数)。

#include<bits/stdc++.h>
char s[105];
int main()
{
	int T; scanf("%d",&T);
	while(T--)
	{
		int n,a,b;
		scanf("%d%d%d%s",&n,&a,&b,s+1);
		if(b>0)
		{
			printf("%d\n",(a+b)*n);
			continue;
		}
		int cnt=1;
		for(int i=2;i<=n;++i) if(s[i]!=s[i-1]) ++cnt;
		printf("%d\n",a*n+b*(cnt/2+1));
	}
}

C. Manhattan Subarrays

(一开始把题目看错了,以为是子序列QAQ)

显然题中 good 子段即为不含长度 \(\ge 3\) 的单调不增/不减子序列,画图易得这样的子段长度不超过 \(4\),直接暴力即可。

#include<bits/stdc++.h>
inline int gi()
{
	char c=getchar(); int x=0;
	for(;c<'0'||c>'9';c=getchar());
	for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+c-'0';
	return x;
}
const int N=2e5+5;
int n,a[N];
bool check(int l, int r)
{
	for(int i=l;i<=r;++i)
		for(int j=i+1;j<=r;++j)
			for(int k=j+1;k<=r;++k)
			{
				if(a[i]<=a[j]&&a[j]<=a[k]) return 0;
				if(a[i]>=a[j]&&a[j]>=a[k]) return 0;
			}
	return 1;
}
int main()
{
	int T=gi();
	while(T--)
	{
		n=gi();
		for(int i=1;i<=n;++i) a[i]=gi();
		long long ans=0;
		for(int i=1;i<=n;++i)
			for(int j=i;j<=n&&j<=i+3;++j)
				ans+=check(i,j);
		printf("%lld\n",ans);
	}
}

D. Excellent Arrays

题意

求有多少个数列 \(\{a_n\}\) 满足 \(l\le a_i\le r\)\(a_i\neq i\),且在所有满足上述条件的数列中 \(a_i+a_j=i+j\) 的数对 \((i,j)(1\le i\lt j\le n)\) 的个数最多。

题解

posted @ 2021-07-15 14:17  x_faraway_x  阅读(44)  评论(0)    收藏  举报