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;