• 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])
    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

  • 相关阅读:
    【排序算法汇总】
    Redis是否安装
    分布式与集群
    Redis学习
    简单算法定义见解
    KMP算法
    红黑树
    JSP与Servlet的关系
    7、创建图及图的遍历(java实现)
    6、二叉树树(java实现)
  • 原文地址:https://www.cnblogs.com/oxxxo/p/6056799.html
Copyright © 2020-2023  润新知