2022/3/19训练题单
1352B
1512D
1368B
1542B
1399D
1372C
1400C
1352F
282C
916C
980B
214B
题意: 将整数 n n n 拆分成 k k k 个 奇偶性相同的数的和, 换句话来说就是将 n n n 拆分成 k k k 个奇数 或者 k k k 个偶数, 如果存在,则将这 k k k 个奇数,或者 k k k 个偶数打印出来, 不存在则输出"NO"
假设拆分成奇数, 无论拆分成多大的奇数, 这些奇数是一定可以拆分成 1 1 1 的,我们不妨先将 拆分出 k − 1 k - 1 k−1 个 1 1 1, 然后再判断 n − ( k − 1 ) n - (k - 1) n−(k−1) 是否为奇数, 如果不为奇数, 则这种情况不存在
假设拆分成偶数,无论拆分成多大的偶数, 这些偶数是一定可以拆分成2的,我们不妨先拆分出 k − 1 k-1 k−1 个 2 2 2, 注意, 这里还需要判断一下, n 是否大于 2 × ( k − 1 ) 2 × (k - 1) 2×(k−1), 判断完后, 再判断 n − 2 × ( k − 1 ) n - 2 × (k - 1) n−2×(k−1) 是否为偶数, 如果不为偶数, 则这种情况不存在
如果上述两种情况都不满足, 则输出无解
代码:
#include<bits/stdc++.h>
using namespace std;
int t, n, k;
void solve()
{
cin >> n >> k;
if(n > k - 1 && (n - (k - 1)) % 2 != 0) //全是奇数
{
cout << "YES\n";
for(int i = 1; i < k; i ++ )
cout << 1 << " ";
if(n - (k - 1) > 0)
cout << n - (k - 1) << '\n';
return;
}
else if(n > 2 * (k - 1) && (n - 2 * (k - 1) ) % 2 == 0) //全是偶数
{
cout << "YES\n";
for(int i = 1; i < k; i ++ )
cout << 2 << " ";
if(n - (k - 1) * 2 > 0)
cout << n - (k - 1) * 2<< '\n';
return;
}
cout << "NO\n";
}
int main()
{
cin >> t;
while(t -- )
solve();
}
题目大意: 给你一个序列 B B B, 一共有 n + 2 n+2 n+2 项, 其中有 n n n项是另一个数列, 还有一项是另一个数列的前 n n n 项和, 还一项是 X X X
你可以将 X X X 那一项就把它当做,删去某一项, 因为 X X X 没有作用, 然后剩下的就是 n n n 项的数列, 和一个前 n n n 项和, 我们不难发现 前 n n n 项和 一定是最大的,或者第二大的,
不存在这种情况则输出无解
我们设最大的项为 a n + 2 a_{n + 2} an+2, 第二大的为 a n + 1 a_{n + 1} an+1
所以我们可以从先往后枚举删去每一项, 如果当前

本文介绍了五道编程题目的解决方案,涉及奇偶数拆分、数组重构、数字运算与序列操作。通过分析题意,展示了如何利用数学原理和编程技巧解决B/SameParitySummands、D/CorruptedArray、B/Subsequences生成等技术问题。
27万+

被折叠的 条评论
为什么被折叠?



