根据官方讲题写的题解
B
一开始自己的思路就是分奇偶数组
while (t--) {
int n;
cin >> n;
vector<int> evens, odds;//分组
for (int i = 0; i < n; i++) {
int num;
cin >> num;
if (num % 2 == 0) {//检测奇偶
evens.push_back(num);
} else {
odds.push_back(num);
}
}
sort(evens.begin(), evens.end());//排序
sort(odds.begin(), odds.end());
for (int e : evens) {//先输出偶数
cout << e <<' ';
}
for (int o : odds) {//再奇数
cout << o <<' ';
}
cout << endl;
}
看了视频之后 知道可以用 分出奇数之后加一个很大的数的方式 让奇数沉底
while(t--){
int n;
cin>>n;
vector<int> all(n);//一定要记得分配内存啊
for(int i=0;i<n;i++){
cin>>all[i];
if(all[i]%2) all[i]+=1e9;
}
sort(all.begin(),all.end());
for(int i=0;i<n;i++){
if(all[i]%2) all[i]-=1e9;
cout<<all[i]<<" ";
}
cout<<endl;
}
C
比赛的时候没写出来 听了视频感觉有点理解了 再次细读题发现一些端倪
实际上 数组{1,2}和{2,1}是不同的数组 也就是说 如果一个数组是{1,1,1,1}
进行题目里面的操作 只是选2个相邻的数 不需要担心 {1,1,2}和{1,2,1}不是一个数组
因为是选相邻的数 所以就是在相邻的数里面选一个决策 加或者不加
不同的合并选择产生的数组要么长度不同,要么元素序列不同。所以元素值不影响不同性,只影响数组的具体值,但既然我们关心的是本质不同,即数组序列是否相同,而不同的选择总是产生不同的序列,所以答案只取决于n。
所以事实上 只需要输出 2的n-1次方对998244353取模 的数就可以了
while(t--){
int n;
cin >> n;
vector<int> a(n + 1);
for(int i = 1; i <= n; i++){
cin >> a[i];
}
n--;
cout << ksm(2LL, n, MOD) << endl;
}

京公网安备 11010502036488号