T1:
一道看似复杂时而简单的题目.
只要弄懂直线方程的含义以及运算就可以了.
任何一条直线,其方程为 ax+by+c=0
那么,如果要求y,just =-((ax+c)/b)
求 x,just =-((bx+c)/a)
懂得求一条直线上的x,y坐标后,我们可以发现,对于一个平面上的任意两点,一定可以通过一条直线间接到达.
那么,我们直接求出两点对应的在直线上的坐标,有四种到达的情况,分别求一下值取个最小就可以了,另外还有一种直接垂直到达的,也需要判断.
T2:
这是一道挺有意思的题目.
我们把题目给的原序列先排个序,找出原序列的每个数排序后所应该在的位置.
那么,对于每一个数,他都一定在某一“环”里.
THe mean is 它一定会有一个它需要到达的位置,那么它需要它到达的位置又有一个那个位置需要到达的位置.
以此类推,可以构成一个互相到达的环.
就算它不用动,也视作它自己是一个环.
把这个环找好后,我们可以知道每次换的时候一定是拿一个最小值去依次替换,较大值只换一次,最小值换n-1次.
那么,这里应该分两种策略:
第一种:拿这个环里的最小值去换.
第二种:拿整个序列的最小值去换.
两者的较小值肯定是所有策略的最小值,正确性显然.
T3:
虽然,这是考试我唯一水了分的题,本以为很难,其实不然.
你只需要明白一个性质:
a[i]<=12^10
也就是说a[i]它与其他数构成的gcd,要么是他自己,他么是他自己的因数,那他最多能构成多少个不同的gcd?
显然,log(a[i])个.
那么,具体如何操作呢?
我们每次枚举一个i代表以第i个数结尾.
之前能构成的gcd一定不多,那么,储存一个表,每次我们都把所有可能组成的gcd储存下来,并把接下来不可能出现的gcd删掉,然后删掉再重复的,以后拿着个表去更新gcd,反正个数已知不可能超过 log(a[i])个,很小。
时间复杂度估量一下大概——O(TN*logK)
T4:
也是需要点思维的 题目.
因为正推实在太繁琐,而最终的结果又知道了,为何不尝试一下逆推呢?啊?
逆推的话就真的very easy啦~
我们只需要知道一个性质:
任何时候先分裂再加一定比加了再分裂好.
所以,按照这个思路,我们可以得出如下结论:
任何时候,对于第i个数,只要>0,一定是减一,只要=0,一定得合并.
合并的意思就是把
所有当前为0的数 / 2 (取上整).
怎么判断当前这个数是否为0呢?
废话,如果这个数的值=x,那么不就当第x时刻的时候,x不就等于0了咯。
MDzz..
这一套题目的每道题都值的我好好消化,这次考的不好,但其实是件好事,因为考的越差,证明这套题目所掌握的知识也就越少,收获的知识自然就较多咯~~