因为是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
考场想了很久,没有结果,正解是考虑先找到一个所在的集合,然分别二分。