代码源集训复盘Day6

代码源集训复盘

Day6(7.26):构造题单

拿到一个首A非常爽。(为啥大家构造这么强????)


A Gym - 105911M

思维有点绕。

  • 结论: k k k 个不翻转放入 1 1 1,余下翻转并放入 2 2 2。(也可以 x x x 个翻转放入 1 1 1,余下不翻转放入 2 2 2

  • 证明:设放入第一堆的有 x x x 个一开始被翻转,则第二堆中一开始就有 k − x k-x kx​ 个一开始被翻转。

    进行结论中的操作后,第一堆有 k − x k-x kx 个背面朝上,而第二堆中也有 k − x k-x kx 个背面朝上。

    得证。

int n,k;
signed main(){
   
   
	read(n,k);
	for(int i=1;i<=k;i++)
		cout<<1;
	for(int i=1;i<=n-k;i++)
		cout<<4;
	return 0;
}

B Gym - 105615D

首A,爽!(因为题目说先做这个)

符合题目名字的通过人数。

  • 结论:先从小到大输出所有偶数后从小到大输出所有奇数。

  • 证明:因为题目要使 ∑ i = 1 n − 1 gcd ⁡ ( a i + 1 , a i + 1 ) \sum_{i=1}^{n-1} \gcd (a_i+1,a_{i+1}) i=1n1gcd(ai+1,ai+1) 最小,所以每一个 gcd ⁡ ( a i + 1 , a i + 1 ) \gcd (a_i+1,a_{i+1}) gcd(ai+1,ai+1) 都要最小。容易知道,相邻两个自然数的最大公因数总是为 1 1 1。所以,当把所有偶数放一起,奇数放一起时是最优的。而在偶数与奇数交界处,为 2 n 2n 2n 1 1 1 gcd ⁡ \gcd gcd 必然为 1 1 1​。

讲一下如何获得首A:观察样例易得,偶数在前奇数在后,随便一试就过了。

void sol(){
   
   
	int n;
	read(n);
	for(int i=2;i<=n;i+=2)
		cout<<i<<' ';
	for(int i=1;i<=n;i+=2)
		cout<<i<<' ';
	cout<<endl;
}

C Gym - 105486L

构造一百个数,前 50 50 50 个放 A A A,后 45 45 45 个放 B B B,再后 4 4 4 个放 C C C,最后放 1 1 1 C + 1 C+1 C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值