GXNU竞赛集训队第一次训练题解

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

2022/3/19训练题单

1352B
1512D
1368B
1542B
1399D
1372C
1400C
1352F
282C
916C
980B
214B

B. Same Parity Summands

题意: 将整数 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 k1 1 1 1, 然后再判断 n − ( k − 1 ) n - (k - 1) n(k1) 是否为奇数, 如果不为奇数, 则这种情况不存在

假设拆分成偶数,无论拆分成多大的偶数, 这些偶数是一定可以拆分成2的,我们不妨先拆分出 k − 1 k-1 k1 2 2 2, 注意, 这里还需要判断一下, n 是否大于 2 × ( k − 1 ) 2 × (k - 1) 2×(k1), 判断完后, 再判断 n − 2 × ( k − 1 ) n - 2 × (k - 1) n2×(k1) 是否为偶数, 如果不为偶数, 则这种情况不存在

如果上述两种情况都不满足, 则输出无解

代码:

#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();
}

D. Corrupted Array

题目大意: 给你一个序列 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
所以我们可以从先往后枚举删去每一项, 如果当前

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广西小蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值