美文网首页
Codeforces 1355B - Young Explore

Codeforces 1355B - Young Explore

作者: 费城的二鹏 | 来源:发表于2020-06-18 19:37 被阅读0次

日常一道算法题。

翻译

年轻的探险者们

有一群探险者,需要去探险,但是大家能力不足,每个人有自己的不足的经验值 e,表示至少需要跟几个人一起出去探险才安全。

现在需要将探险者分组,当然不是所有的探险者必须出门,部分人员可以留在营地。

请问,最多可以多少组人员安全的出去探险。

输入格式

输入整数 t 表示测试用例组数。

每个测试用例输入两行,第一行输入整数 N 表示探险者的人数。第二行输入 N 个整数,用空格分隔,表示每个探险者的不足的经验值。

输出格式

输出整数 T,表示组数。

分析

这道题超时了两次,其实题目很简单,主要是当 T 很大时,python 的 print() 方法消耗了很多时间,我打印出运行时间相差了 2s,也就是print 方法足足花费了 2s。最后将结果拼接成字符串一次性输出,就节约了大量的时间。

主要是贪婪算法,统计每种不足的能力值的个数,然后尽量让数字小的组队,如果有剩余人员则放入下一个数值的组内,这样递推下去可以得到最多的组数。

代码(Python3)

# https://codeforces.com/problemset/problem/1355/B
 
import sys
import os
import heapq
import math
import time
 
try:
    path = "./file/input.txt"
    if os.path.exists(path):
        sys.stdin = open(path, 'r')
    # sys.stdout = open(r"./file/output.txt", 'w')
except:
    pass
 
t = int(input())
 
def printd(value):
    # print(value)
    pass
 
def case():
    n = int(input())
    count = [0] * (n + 1)
    e = list(map(int, input().split(" ")))
    for number in e:
        count[number] += 1
    
    result = 0
    for index, c in enumerate(count):
        if index == 0:
            continue

        if c >= index:
            result += c // index

        if c % index != 0 and index < n:
            count[index + 1] += c % index
    
    # print(result)
    return result

# start = time.time()

result = ""
for _ in range(t):
    result += str(case()) + "\n"

print(result, end="")
# print(time.time() - start)

更多代码尽在 https://github.com/Tconan99/Codeforces

by 费城的二鹏 2020.06.16 长春

相关文章

网友评论

      本文标题:Codeforces 1355B - Young Explore

      本文链接:https://www.haomeiwen.com/subject/sjldxktx.html