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 = False
Output = []
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])

最重要的不是这个。

学到了一个语句:

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

时间: 2024-11-05 12:12:27

codeforces_730_A的相关文章