题解:CF2131B Alternating Series
yiming1123 · · 题解
题目大意
给你一个数
- 相邻两个元素的积为负。
- 对于任意长度大于
1 的子串,其元素和为正。 -
构造出来的字符串的字典序最小。
解题思路
题目要求字典序最小。贪心地想,我们所选的数字的绝对值越小,其构成的字符串的字典序就越小。
手玩一下样例可以发现,奇数位应该为负,偶数位为正,否则就不能同时满足长度大于
::: 接下来我们再观察样例,发现:
- 当
n 为偶数时,正数出现了2 。 - 当
n 为奇数时,正数出现了3 。
因为样例太小了,我们还看不出正真的规律。可举
:::
这就是答案了,但怎么既出现了
若把
将这个思路代入子串
总结
奇负偶正,负数选
Code
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define lint long long
#define line inline
line lint read(){
lint x=0;int f=1;char c=getchar();
while(c<'0' or c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0' and c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
int T,n;
int main(){
T=read();
while(T--){
n=read();
int k=(n-1)/2+1;
int m=!(n%2)?-1:0;
for(int i=1;i<=n+m;++i){
if(i&1) printf("-1 ");
else printf("%d ",k+1>3?3:k+1);
}
if(m) printf("2 ");
printf("\n");
}
return 0;
}