OD C卷 - 小朋友来自多少小区

小朋友来自多少小区 (100)

  • 每个小朋友报出与自己同一个小区的人数,存入数组garden中;
  • 计算至少有几个小区?多少小朋友?
    输入描述:
    输入garden数组,如2 2 3, 即第一个小朋友报出有2个小朋友跟自己同一个小区,第二个小朋友同样报出2个,依次类推; garden数组长度最大为999;
    输出描述:
    至少的小区数,小朋友数

示例1
输入:
2 2 3
输出:
2,7

示例2
输入:
2 2 2 2 2 3 3
输出:
3,10

思路:

  • 贪心算法,依次遍历,让尽可能多的小朋友在同一个小区;
    • garden 升序排序;
    • 初始化 小区数areas=1, friend_nums = garden[0]+1,dist= garden[0]
    • 从i=1开始遍历garden,for i in range(1, len(garden)): 如果当前报数与前一个报数相同,则判断能否算入同一个小区;
      • 是,则dist-=1,继续下一次遍历;
      • 否,则areas += 1, friend_nums += garden[i] +1, dist=garden[i]
    • 输出areas,friend_nums


class GardenNum:
    def solution(self, garden):
        # 排序
        garden.sort()
        # 初始化
        areas = 1
        friend_nums = garden[0] + 1
        dist = garden[0]
        for i in range(1, len(garden)):
            if garden[i] == garden[i-1]: # 可能是同一个小区
                if dist > 0:
                    # 算入同一个小区
                    dist -= 1
                else:
                    areas += 1 #
                    friend_nums += garden[i] + 1
                    dist = garden[i]

            else:
                # 报数与前一个不同,肯定不是同一个小区
                areas += 1  #
                friend_nums += garden[i] + 1
                dist = garden[i]

        print(areas, end=",")
        print(friend_nums)


if __name__ == '__main__':
    garden_num = GardenNum()
    while True:
        try:
            garden = list(map(int, input().strip().split()))
            garden_num.solution(garden)
        except KeyboardInterrupt:
            break

其他基于索引的实现:

nums = [int(x) for x in input().split(" ")]
#index为报告的结果,zones[index]为报告相同结果的总人数
zones = [0 for x in range(1000)]
count = 0
 
i=0
while(True):
  if(i>=len(nums)):
    break
  else:
    zones[nums[i]]+=1
  
  i+=1
 
 
for j in range(1000):
    if (zones[j] <= 0):
      continue
    else:
      total = math.ceil(zones[j] / (j+1));
      count += total * (j+1);
print(count);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值