1300构造1x15

本文详细介绍了在Codeforces平台上遇到的多个编程问题,涉及数学、算法和逻辑思维,包括数独变体、数组操作、排序优化等。作者分析了问题的关键点,如最大化朋友对数、构建反数独矩阵、处理二元组序列等,并分享了解决思路和错误教训,强调了正确理解题目条件和运用适当策略的重要性。
摘要由CSDN通过智能技术生成

一天就干完了,比想象中快了不少,明天检测下😋

1.B. Random Teams 错,一个细节处理出问题了。

Problem - 478B - Codeforces — 问题-478B- Codeforces
CF478B Random Teams - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#数学 #公式 #直接构造 #所求 #结果

n*(n-1)/ 2
有n个人,m个队伍,要把n个人分到m个队伍,每个队伍至少一个人,同一个队伍里的人会成为朋友,求最大朋友对数以及最小朋友对数

观察结果
既然要求对数,不可避免的需要用到n*(n-1)/ 2这个公式平方级别的增长非常快,所以要求最大对数应该是让所有人尽量分到同一组。
而最小对数,就是相反的让人数尽量平均。
我的思路
朋友队数量是每一队的n*(n+1) /2,增长越来越快,所以maxn就是让人数尽量集中,minn就是尽量分散。
5,1论破。

1 2 3 4 5
1 2
1 3
1 4
1 5

2 3
2 4
2 5

3 4
3 5

4 5

从1到n-1,应该是n(n-1) / 2;
最大的n就是n-m
最小的n就是n/m + n%m

2.D. Anti-Sudoku 对了

Problem - 1335D - Codeforces
Anti-Sudoku - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#直接构造 #数学 #数独
有一个9x9数独矩阵,对其进行9次替换数字的操作,使得数独的任何一个条件都不满足即,使得其成为反数独矩阵。

数独游戏里,每一行每一列,每一个子3x3矩阵,都没有重复元素。总共9行9列9个3x3宫格,所以9次操作每一次都要使得不同的1行1列1个3x3宫格的元素改变。
我的思路
考虑竖着改,斜着改,横着改
题目要求每一行每一列都不独,所以竖着改横着改都不符合要求,只有斜着改。
只有当前数字符合题意,所以改成和当前数字不一样就行了。
1,9改成2,其他改成1。
题解思路
我的思路漏了3x3格子的条件,要满足这个的话,在斜着改的基础上,把要改的点分配到每个3x3格子。

3.B. Trouble Sort

Problem - 1365B - Codeforces — 问题-1365B- Codeforces
CF1365B Trouble Sort - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#直接构造 #交换 #排序 #数组 #操作 #不熟悉
有n长度二元组序列,a,b表示大小以及类型,如果类型不同就可以交换位置,求是否有解让其非降序排列
通过观察操作:
重要定理 :
只要有一个不同的,就可以依靠这个不同点来交换其他点。
只有全部点相同时才会无解。

我的思路
只有元素类型相同的可以交换,只要类型相同就一定可以以任意顺序排列,
则可以复制二元数组后排序,然后遍历排序后的,检查,当前元素的元素类型和原本在这里的元素类型对不对的上。

可能一个值同时有两种元素类型的,可能会把有解情况判成无解。
论破

可以先按类型关键字排序,然后复制后的数组再双关键字排序,让0对0,1对1,对不上就可以立刻无解。

题解思路
忽略了题目条件,种类不同才可以交换,这样只要有一个不同的就可以全部互相交换,如果全部相同,则不能交换,检查是否有序。

4.C. Mere Array

Problem - 1401C - Codeforces — 问题-1401C- Codeforces
CF1401C Mere Array - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#数组 #排序 #直接构造 #gcd #数学 #最小公倍数 #操作 #不熟悉
有一个数列,如果gcd(ai,aj) = 最小值minn,则可以交换ai,aj。求是否能够非降序。
观察操作,
一个重要的定理
若min | x,则gcd(min,x) = min
对于操作的描述,只有gcd=min的两个数能够交换,则能交换的数都被minn整除。
排序后,对照前后两个数,不同且不能被min整除则是无解。

我的思路
想到一个可能的定理
gcd

如果gcd(a,b) = d
gcd(b,c) = d,
则gcd(a,c) = d
4 2
2 8
论破。

2,8,4
4和8不能直接联通,但可以通过2来联通,实现交换。
所以可以两两枚举,如果gcd(i,j) = minn,就并查集穿起来,然后可以复制数组并排序,遍历判与原数组元素是否联通,复杂度不合适。
卡壳
题解思路
一个重要的定理
若min | x,则gcd(min,x) = x
所以只要min能整除的数,都可以通过min来交换,在我的思路去掉两两枚举的基础上,,直接判断元素是否和原数组元素相等,不相等且不能被min整除则无解。

5.C. Social Distance

Problem - 1367C - Codeforces — 问题-1367C- Codeforces
Loading - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#前缀和 #直接构造 #字符串
有一个01串和k,可以把0变成1,如果1之间至少有k个0,求最多可以变多少次。

通过前缀和是否相同来判断01串中两点间是否有1.遍历的时候满足条件的就改,然后做一下边界判断再判断是否满足条件即可。
我的思路
以k为间隔遍历,如果能插肯定立刻插,确保一边的合法最小间隔。
如何判断能否插,可以通过做前缀和,如果当前位置与上一位置,下一位置的前缀和相同就可以插了。cnt++。可能会越界,加一个合法判断就可以了。先合法再判前缀和
题解思路
1.负数下标可以通过记录上一个1的位置来处理,后一个1可以前缀和相等。
2.k为间隔遍历会出现一些问题,不一定找到合法最小间隔。

6.A1. Prefix Flip (Easy Version)

Problem - 1381A1 - Codeforces — 问题-1381A1- Codeforces
CF1381A1 Prefix Flip (Easy Version) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#操作构造 #直接构造 #前缀操作 #翻转操作 #反转操作 #不熟悉
有两个n长度的二进制串,01串a,b,可以选择a中一个前缀,使得其顺序翻转,01反转,求是否能在3n次操作内将a串变为b串

套路:

题目中有提到3n次操作必定有解,2n次操作必定有解,可以通过3次或2次操作构造,来构造出一个操作只修改序列中的一个元素为符合条件的元素。
观察反转且翻转的前缀操作,基本是有一个偶数次操作会保持不变的思想,只要对需要修改的元素执行奇数次操作,就可以成功构造符合条件的操作。

比较好想一点,对于前缀操作,可以把这个元素翻转的第一位,然后对第一位操作,之后再翻转回原位。
难想一点:
前缀操作的特性是只对前面造成影响,则可以从后往前处理,将第一位的元素变成符合条件的元素,再翻转上来。最多需要2n次操作。
我的思路
看到3n次操作必有解,想到了之前写的构造操作题。
011

abb 要改成aab

只要把他变成第一个
bab -》abb
然后反转本身
bbb
再反转回原来位置
aab -》aab。
也就是1-n时,输出本身位置,然后输出1,再输出本身位置。

能否转为
100
101
110
111
000
001
010

题解思路
还有2n次操作的做法
重要定理
因为是前缀操作,所以从后面开始改的话就不用考虑前面发生了什么变化了。

因为顺序反转,第一位和当前位互换,所以考虑第一位是否与从后遍历的要改位相同,如果相同的话,先修改第一位再交换。

7.B. Nastia and a Good Array卡壳

Problem - 1521B - Codeforces — 问题-1521B- Codeforces
CF1521B Nastia and a Good Array - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#不熟悉 #操作 #替换操作
有一个n长度的正整数数组,定义数组为good,如果相邻的两项gcd为1.
有一个操作,选择两个数x,y如果min(ai,aj) = min(x,y),则把ai变成x,aj变成y
求是否能在n次操作内将数组变为good

考察常见质数1e9+7,1e9+9,以及
小于质数的数和这个质数互质。
所以考虑把数字替换成比minn大的质数。minn<=1e9,可以改成1e9+7,1e9+9

我的思路
卡壳
题解思路
遇到不熟的重要定理
小于质数的数和这个质数互质。

以及看错了题目操作,xy是可以自己挑选的,从ai<1e9,而xy<2e9,以及样例也可以推出。

则挑选两个大于1e9的质数,最小值不变(通过最小值来修改其他值min(ai​,aj​)=min(x,y)),其他值替换成这两个大质数的交替。

8.C. Coin Rows

Problem - 1555C - Codeforces
CF1555C Coin Rows - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#直接构造 #操作 #前缀和
有一个2xm矩阵,2行m列,矩阵每一个位置都有金币。bob和alice在(1,1),要去到(2,m),alice先出发,只能向右或向下,且会把路上的金币全部收走,之后bob出发,求bob能收集到的最大金币数量。
观察操作,因为只能向右向下,所以,有一条路径是一直在下面。然后可以枚举在上面的哪一个点下去。通过前缀和来对比找到最少金币方案,并记录位置p。然后再鲍勃,只需要对比下面1-p-1的前缀和,和p+1-m的后缀和,输出最大值。

9.D. Number into Sequence

Problem - 1454D - Codeforces — 问题-1454D- Codeforces
CF1454D Number into Sequence - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#直接构造 #唯一分解定律 #数学 #数论 #所求
有一个n,要构造一个k长度的序列,要求ai>1,乘积=n,k尽可能大,i在1-k-1的ai可以被ai+1整除.n>1,数列总是存在。

观察所求,乘积等于n,且k尽可能大,唯一分解可以分解出最多的因子,所以选用。
因为要整除,所以有一个因子是每一项必须有的,就是数量最多的因子,其数量即为k
k-1项单独输出这个因子,剩下的一项把n的剩下所有因子全部输出。
我的思路

  • k is the maximum possible (i. e. the length of this sequence is the maximum possible).
    k 是最大可能(即e.该序列的长度是可能的最大值)。
    看不懂这个条件,

本来以为这个说的是序列的元素不能大于序列长度,但看样例发现论破。
2对应
1
2
如果没有这个条件,答案就是
1
n

题解思路
懂了,就是要让k最大的意思。
通过唯一分解定理分解因式,然后统计数量。
最多的一项数量记为k,输出k-1次,作为单独的k-1项,然后再连同所有剩下的因数输出对应次数。

10C1. Pokémon Army (easy version)

Problem - 1420C1 - Codeforces
CF1420C1 Pokémon Army (easy version) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#dp #所求
有一个长度n的序列,可以从中选取一个子序列b,获得ab1-ab2+ab3-ab4+…-…的值,求最大的值。
考察dp选与不选的状态转移。找最值。根本不是构造题
看所求,最值选择方案,dp。
我的思路
观察操作,大体是有两种方式,
一是只选择最大值,
二是全选,军队力量
比较后输出最大值即可。

题解思路
操作看错了,不一定选的越多越好,因为力量看的是a1-a2,+ a3 - a4. + a5.
要看选择情况,所以就是dp
![[Pasted image 20230601202844.png]]

11A. Di-visible Confusion

Problem - 1603A - Codeforces — 问题-1603A- Codeforces
CF1603A Di-visible Confusion - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#直接构造 #操作 #整除
有一个数列,如果ai能被i+1整除则可以抹除掉这个元素。下标变换,然后对新得到的数列,继续进行操作。求是否能把数列删为空。
观察操作,从前往后如果能够被2到i+1的一个数整除,则迟早可以删掉这个数。
否则永远删不了,无解。
我的思路
i+1大于2,则质数只会被自己整除
小于i+1的数不会被整除。
则可以对二元组排序,通过二元下标访问到原数组元素,从小数开始擦除。

题解思路
如果一个数不能被擦除,说明这个数是lcm(2,3,4,5,。。。i+1)
否则能被2到i+1的一个数整除。
只要遍历,然后枚举判断是否能被2到i+1整除即可。
![[Pasted image 20230601165001.png]]

12.B. Road Construction

Problem - 330B - Codeforces — 问题-330B- Codeforces
CF330B Road Construction - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
有n个城市,m(<n/2)对城市之间不能建设道路,需要在n个城市之间建路,使得任意两个城市可以通过最多两条路连接。
考察菊花图。类似把这个城市作为根,其他城市作为叶子
由让所有城市最多穿过两条道路就可以到达所有城市,有一个菊花图的猜想。
加上因为m<n/2,所以肯定可以找到一个城市可以连接其他所有城市,形成菊花图。

13.B. Simple Game

Problem - 570B - Codeforces — 问题-570B- Codeforces
CF570B Simple Game - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#数学 #直接构造 #数论
有一个m点和长度为n的段,m<=n ,c会在1-n间随机取值,选一个点b,使得|c-m| < |c-b|的概率最大。
要让概率最高,则b要尽量靠近m,所以要么选择m-1,要么m+1
比较区间的大小或者直觉,m-1 >= n-(m+1)+1时选择m-1。否则选m+1,考虑前提:n必须>=2
n == 1时只能输出1
我的思路
类似选择离边界最远的点。
观察样例,可以知道应该要选在米尔的相邻位置,且离边界最远
所以如果米尔在<=n/2,选择米尔+1,否则选择米尔-1.

题解思路
根据题目
![[Pasted image 20230601220132.png]]
特判一个n = 1的情况。

14.D. Co-growing Sequence

Problem - 1547D - Codeforces
CF1547D Co-growing Sequence - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#读不懂题意 #位运算 #直接构造 #所求

有一个长度n的数组a,要构造一个字典序最小的数组b,使得(ai ^ bi) & (ai+1 ^ bi+1) == (ai ^ bi)

字典序最小,则b1要输出0,然后根据运算结果接着构造后面的刚好满足条件的项。ai中不是1,考虑只通过异或将
ai+1中不是1而ai中是1的二进制位,通过在b中赋上1来处理,ai+1中有1的,而ai没有的,就通过bi+1中的0来降低字典序。

n = read(), a = read(), putchar('0'), putchar(' ');//先输入一个a,再输出0,因为第一个b一定是0
		for(int i = 2; i <= n; i++)
		{
			b = read();
			print((b | a) ^ b), putchar(' ');//b要补齐a中没有的1
			a |= b;//把a中的1补齐
		}

![[Pasted image 20230601184518.png]]
题解也看不懂
lexicographically字典序
bitwise XOR. 按位取反

15A. Knapsack

Problem - 1446A - Codeforces — 问题-1446A- Codeforces
CF1446A Knapsack - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
knapsack 背包·
有n件物品重wi,背包容量W,求是否可以选一些物品,使得总重量>= W/2 , < = W;
感觉是纯贪心题,跟构造好像也没关系
排序后从后往前,取的第一件是<W/2,或>= W/2(这时直接输出了) 或一直取不到(无解)继续讨论第一种情况,因为有序,所以前面的数也都< W/2,所以不会出现取了就立刻> W的情况,一直取直到>= W/2,或取完了所有数之后,还不满足情况,无解。

我的思路
选和不选的问题,似乎是dp,但我不会啊。

题解思路
从大到小取,如果>= W/2 了就输出。否则遍历完了无解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值