首页 > 其他 > 详细

解题报告:CF58C

时间:2020-04-04 23:06:32      阅读:64      评论:0      收藏:0      [点我收藏+]

题目链接:CF58C Trees
\(CF\)\(1800\)的题。
可以用桶来计数,设\(b[i]\)为第一个数为\(i\)时合法的数的个数,显然这个是可以\(\mathcal O(1)\)直接算的,然后就做完了。
一些我犯的\(SB\)错误:
\(1.\)正整数序列没看到正。
\(2.\)注意\(b\)的非一值不一定只到\(n\),要循环到到\(1e5\)
......
然后做得我懵逼至极,总体上说这道题还是比较考思维的,能做出来很不错了......
时间复杂度是\(\mathcal O(n)\),可以通过本题。

\(Code\):

#include<iostream>
#include<cstdio>
using namespace std;
#define MAXN 100005
int a[MAXN];
int b[MAXN];
int n,maxn=0;
int main()
{
	#define read(x) scanf("%d",&x)
	read(n);
	for(int i=1;i<=n;i++) read(a[i]);
	int mid=n%2==1?n/2+1:n/2;
	for(int i=1;i<=mid;i++) if(a[i]+1-i>0) b[a[i]+1-i]++;
	for(int i=mid+1;i<=n;i++) if(a[i]+i-n>0) b[a[i]+i-n]++;
	for(int i=1;i<=100000;i++) maxn=max(maxn,b[i]);
	printf("%d\n",n-maxn);
	return 0;
}

当然要对左半部分和右半部分分别计算。

解题报告:CF58C

原文:https://www.cnblogs.com/tlx-blog/p/12634172.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!