AtCoder Beginner Contest 263

AtCoder Beginner Contest 263

A. Full House

基本思路:先把输入的 \(5\) 个数排一个序,若 \(a_1=a_2=a_3,a_4=a_5\)\(a_1=a_2,a_3=a_4=a_5\),则为 Full Horse。

B. Ancestor

基本题意:\(i\) 个人父亲是 \(f_i\),求人 \(1\) 和人 \(n\) 有多少代。

基本思路:进行一遍 dfs ,统计一下深度即可。

参考代码:

void dfs(int u, int fa) {
	dist[u]=dist[fa]+1;
	for(int p=first[u];p;p=ed[p].next)if(ed[p].e!=fa) dfs2(ed[p].e,u);
}
dfs(1,0);
cout<<dist[n]-1<<endl;

C. Monotonically Increasing

基本题意:给定 \(n,m\),求出所有长度为 \(n\),最大值小于 \(m\) 的非严格递增序列。

int n,m,vis[N];
void dfs(int i, int l) {  // l为上一个数的值
	if(i==n+1) {
		_for(i,1,n) cout<<vis[i]<<' ';
		puts("");
		return;
	}
	for (int j=l+1;j<=m;j++) {  
		vis[i]=j;
		dfs(i+1,j);
		vis[i]=0;
	}
}

D. Left Right Operation

基本题意:求出一个 \(pair(x,y)\),让序列前 \(x\) 个数替换成 \(a\),让序列后 \(y\) 个数替换成 \(b\),使得替换后的数组和最小。

基本思路:
定义 \(ls_i\) 表示前 \(i\) 个数选择前 \(x\) 个数进行替换让差更大(\(x\leq i\))。
定义 \(rs_i\) 表示后 \(i\) 个数选择后 \(y\) 个数进行替换让差更大(\(y\leq i\))。
定义 \(sum_i\) 表示数组的前缀和。

\(ls_i=\max\{ls_{i-1},sum_i-l\times i \ \}\)\(rs_i=\max\{rs_{i+1},sum_n-sum_{i-1}-r\times (n-i+1)\}\)

最后求答案为 \(sum_n-\sum ^{i=n}_{i=0}ls_i+rs_{i+1}\)

_for(i,1,n) cin>>a[i],sum[i]=sum[i-1]+a[i];
_for(i,1,n) sl[i]=max(sl[i-1],sum[i]-l*i);
_pre(i,n,1) sr[i]=max(sr[i+1],(sum[n]-sum[i-1])-r*(n-i+1));
int res=-1e18;
for(int i=0;i<=n;i++) res=max(res,sl[i]+sr[i+1]);
cout<<sum[n]-res;
posted @ 2022-08-08 22:28  Otue  阅读(50)  评论(0编辑  收藏  举报