11.12 解题报告

因为是IOI赛制所以不存在期望得分

T1

实际得分:\(100\) pts
用时:\(20\) min
简单构造,直接一个 a 剩下的都是 b 就行。

signed main(){
	int n=read();
	putchar('a');
	for(int i=2;i<=n;i++) putchar('b');
	return 0;
}

T2

实际得分:\(50\) pts(满分 \(50\) pts)
用时:\(50\) min
打个表就会发现,最优构造是先 \(1\) \(-1\) 交替放然后剩下的都扔到最后面。

signed main(){
	int n=read(),sum=0;
	for(int i=1;i<=n;i++){
		a[i]=read();
		sum+=(a[i]==-1);
	}
	if(sum<n-sum){
		for(int i=1;i<=min(sum,n-sum)*2;i++){
			if(!(i&1)) printf("-1 ");
			else printf("1 ");
		}
		for(int i=sum*2+1;i<=n;i++) printf("1 ");
	}
	else{
		for(int i=(n-sum)*2+1;i<=n;i++) printf("-1 ");
		for(int i=1;i<=min(sum,n-sum)*2;i++){
			if(i&1) printf("-1 ");
			else printf("1 ");
		}
	}
	return 0;
}

T3

用时:\(20\) min
得分:\(10\) pts(满分 \(50\) pts)
考虑分类讨论:
设有 \(a\)\(1\)\(b\)\(-1\)
对于 \(a\le b\),需要保证没有任何两个 \(1\) 相邻,所以相当于是在 \(b+1\) 个空隙中插入 \(1\),方案数是 \(C_{b+1}^a\)
对于 \(a>b\) 的情况,达到下界 \(a-b\) 充要条件是每一个前缀和都在 \([0,a-b]\) 上,这个直接 dp 就行了。

T4

用时:\(1\) h
得分:\(20\) pts
考场想了很久,没有结果,正解是考虑先找到一个所在的集合,然分别二分。

posted @ 2022-11-12 22:54  wapmhac  阅读(19)  评论(0编辑  收藏  举报