首页 > 代码库 > codeforces_730_A

codeforces_730_A

这题题目的大意:

从一行数中,随意取出2-Min(5,n)个数,让它们都-1  (如果是0,就不能-1)

最后,求它们需要处理几次,才能它们全部都相等。

大致题解:

根据它的样例输出,我们可以知道:

每次取出2个或者3个一起-1就可以了,

为什么呢?

证明:

取出4个都-1 就等于 取出2次 2个都-1

取出5个都-1 就等于 取出1次 2个都-1 + 取出1次 3个都-1 

 

那么接下来就很好做了,一道练手的题目。

附上代码,刚刚开始写python 有点丑

技术分享
n = (int(input()))R = list(map(int,input().split()))Time = 0;check = FalseOutput = []while (check == False):    pos_max = [];     pos_sec = [];    Max_sec = -1;    Max_num = 0;    Max = -1;    Min = 999999999;     Time += 1;    string = ‘‘    for i in range(len(R)-1,-1,-1):        if (R[i] < Min):            Min = R[i]        if (R[i] > Max):            Max_sec = Max;      Max = R[i];            pos_sec = pos_max;   pos_max = [];            pos_max.append(i);            Max_num = 1        elif (R[i] == Max):            Max_num += 1;            pos_max.append(i)        elif (R[i] > Max_sec):            Max_sec = R[i]            pos_sec = []            pos_sec.append(i)#    print(Max,‘ ‘,Max_sec,‘ ‘,pos_max,‘ ‘,pos_sec,‘ ‘,R)    if (Max == Min):        check = True        break    if (Max_num > 1):        if (Max_num % 2 == 1):            j = 0;  some = []            for k in range(n-1,-1,-1):                if (pos_max[j] == k):                    if (R[k] != 0): R[k] -= 1;                    some.append(k)                    j += 1;                    if (j > 2):  j = 0;            j = len(some)-1            for k in range(n):                if (some[j] == k):                    string += 1                    j -= 1                    if (j < 0): j = 0;                else : string += 0;        else :            j = 0;      some = [];            for k in range(n-1,-1,-1):                if (pos_max[j] == k):                    if (R[k] != 0): R[k] -= 1;                    some.append(k);                  #  print(‘1‘, end=‘‘)                    j += 1;                    if (j > 1):  j = 1;            j = len(some)-1            for k in range(n):                if (some[j] == k):                    string += 1                    j -= 1                    if (j < 0): j = 0;                else : string += 0;    else :        for k in range(n):         ##   print(‘k is ‘,k)            if (pos_max[0] == k):                if (R[k] != 0): R[k] -= 1;                string += 1                #print(‘1‘, end=‘‘)                continue            if (pos_sec[0] == k):                if (R[k] != 0): R[k] -= 1;                string += 1                #print(‘1‘, end=‘‘)                continue            string += 0            #print(‘0‘, end=‘‘);     #   print(‘\n‘)    Output.append(string)print(Max)print(Time-1)for i in range(len(Output)):    print(Output[i])
View Code

 

 

最重要的不是这个。

学到了一个语句:

i = max(range(n), key = lambda x: d[x])

这句话的意思就是 取出 d这个List中最大的那个数的位置,神奇的东西。

 

answer.append(‘‘.join(1 if k == i or k == j or k ==z else 0 for k in range(n)))

join 的用法:

SS = {hello: 1, good: 2, boy: 3, CqDef_Xxx: 4}print(:.join(SS))

就是在dict中每个东西之间加上冒号:hello:good:boy:CqDef_Xxx

回到上面那句话:原来Python可以写的这么优雅,Get到一个JN

 

codeforces_730_A