PDD2019种树

小多想在美化一下自己的庄园。他的庄园毗邻一条小河,他希望在河边种一排树,共 M 棵。小多采购了 N 个品种的树,每个品种的数量是 Ai (树的总数量恰好为 M)。但是他希望任意两棵相邻的树不是同一品种的。小多请你帮忙设计一种满足要求的种树方案。

输入描述:
第一行包含一个正整数 N,表示树的品种数量。
第二行包含 N 个正整数,第 i (1 <= i <= N) 个数表示第 i 个品种的树的数量。
数据范围:
1 <= N <= 1000
1 <= M <= 2000

输出描述:
输出一行,包含 M 个正整数,分别表示第 i 棵树的品种编号 (品种编号从1到 N)。若存在多种可行方案,则输出字典序最小的方案。若不存在满足条件的方案,则输出"-"。

输入例子1:
3
4 2 1

输出例子1:
1 2 1 2 1 3 1

首先判断能否种树:
如果M是偶数,那么如果有某个种类的数量大于M//2, 那么不能种;
如果M是奇数,那么如果有某个种类的数量大于(M+1)//2 , 那么不能种;
接着如何种树:
每次种树之前,先判断剩下的树种有没有数量等于所有树数量一半((M+1)//2)的种类,如果有, 则先种该树,否则,总小到大遍历,找到第一棵可以种的树(要与上一课树不同)

while True:
    try:
        _ = int(input().strip())
        array = list(map(int, input().split()))
        n = sum(array)
        maxer = max(array)
        if n % 2 == 1 and maxer > (n + 1) // 2 or n % 2 == 0 and maxer > n // 2:
            print("-")
        else:
            result = []
            while (n):
                maxer = 0
                index = -1
                for i in range(len(array)):
                    if array[i] > maxer:
                        maxer = array[i]
                        index = i
                if maxer > n / 2:
                    result.append(index + 1)
                    array[index] -= 1
                else:
                    for i in range(len(array)):
                        if array[i] > 0 and (len(result) == 0 or len(result) and i + 1 != result[-1]) :
                            result.append(i + 1)
                            array[i] -= 1
                            break
                        else:
                            continue
                n -= 1
            result = list(map(str, result))
            print(" ".join(result))
    except:
        break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值