A. Digit Minimization
题目大意
给你一个十进制表示中不包含0的数s,Alice可以选择交换两个不同位置的数,Bob删除十进制末尾的数,直到剩下的数字只有一个。
问最后剩下的数字,最小是多少?
题目解析
这个题首先是分析数字的个数是 1 到 3 的情况,然后将更多数字的情况转化到之前已有的情况当中。
- 当数字的个数是 1 的时候,结果就是 s0 。
- 当数字的个数是 2 的时候,因为必须进行一次交换 s0↔s1 ,所以结果就是 s1。
- 当数字的个数是 3 的时候,可以取到 s0,s1,s2 中的最小值。
- 假如最小值是 s0,第一步可以交换 s0,s1,第二步再交换 s0,s1。
- 假如最小值是 s1,第一步可以交换 s0,s2,第二步再交换 s0,s1。
- 假如最小值是 s2,第一步可以交换 s1,s2,第二步再交换 s0,s1。
- 当数字个数大于 3 的时候,如果最小的数字不在前 3 的位置,可以先将最小的数字转移到前 3 的位置,然后如果长度还是大于 3 的话,可以将 s0,s1 进行交换,那么转移到长度为 3 的时候,确保最小值在这 3 个位置当中,那么一定能够取得最小值。
参考代码
B. Z mod X = C
题目大意
已知 a,b,c(a<b<c) ,且x,y,z满足以下条件:
⎩⎪⎨⎪⎧xmody=aymodz=bzmodx=c
对于每组给定的 a,b,c, 构造一组 x,y,z 满足上述条件。
题目解析
把三个式子用公式表示,如下所示:
⎩⎪⎨⎪⎧x=k1∗y+ay=k2∗z+bz=k3∗x+c
由上式可知,如果 k1,k2,k3 均大于 0,可得:
⎩⎪⎨⎪⎧x≥yy≥zz≥x
那么 x=y=z,此时 a=b=c=0,不符合题意。
由此 k1,k2,k3 当中至少有一个数是 0。
由此我们有 k1k2k3=0。
把第三个式子带入第二个,y=k2k3x+k2c+b
然后在把这个式子带入到第一个式子当中
x=k1k2k3x+k1k2c+k1b+a
由此,x=k1k2c+k1b+a
设 k1,k2 均等于 1。(当然构造其他正整数也可以)
⎩⎪⎨⎪⎧x=a+b+cy=b+cz=c
参考代码
C. Column Swapping
题目大意
给你一个 n 行 m 列的格子,你可以选择两列,交换这两列中每一行的两个数字,使其满足每行满足从左到右不递减。
题目解析
把原本的数据arr拷贝一份brr,然后排序拷贝数据brr中的每一行。
比较第i行第j列中arrij和brrij是否相同。如果不同,就代表第j列经过了交换。
然后讨论一下经过交换的列的数目:
- 经过交换的列的数目是0,那么直接输出两个相同的列就可以了。
- 经过交换的列的数目是1,不存在这样的情况。
- 经过交换的列的数目是2,尝试在原本的arr中交换这两列,然后比较是否是和brr一致。
- 经过交换的列的数目大于2,这样的情况不能再交换两列的情况下完成。
参考代码