返回顶部

2021.11.9-测试

今天的测试,挂的太惨了

T1

题目描述:对于一个长度为n的01串,有k个1,求包含奇数个1的区间的长度

找规律:
\(k=1\)时:
image
我们可以知道\(ans=x*y\)
而当\(k=2\)
image
也是与1的情况相类似,通过计算的得到ans
这里就不打出来了
.
.
.
.
.
.
那么对于\(k=n\)的情况,我们可以算到3,然后直接看出规律
最后得到结论:

将k个1全部放在前面,最后一个1放在\((n+k+1-(k\&1)>>1)\)


代码巨短,但我不会
考试的时候只算到了3的情况,导致最后只有40
哎~
所以这一次测试也告诉我:

“DON'T GIVE UP EARLY!”

注意特判

#include<bits/stdc++.h>
#define re register
using namespace std;
int n,k;
int ans[100005];
int main(){
	scanf("%d%d",&n,&k);
	for(re int i=1;i<=n;++i)ans[i]=0;
	if(k==0){
		cout<<0;
		for(re int i=1;i<=n;++i)
			printf("%d ",ans[i]);return 0;}
	for(re int i=1;i<k;i++) ans[i]=1;
	ans[n+k+1-(k&1)>>1]=1;
	cout<<1ll*(n+1)*(n+1)/4<<endl;
	for(int i=1;i<n;i++)
		cout<<ans[i]<<" ";
	cout<<ans[n];
	return 0;
}

PS.
image

posted @ 2021-11-09 17:08  gyc#66ccff  阅读(49)  评论(0编辑  收藏  举报