(C++)HDU-5933——均分(贪心算法)

题目描述

有n个数,对于这n个数,每次只能执行下面两种操作其中的一种:
一:将相邻的两个数相加合并成一个数,
二:将一个数分成相邻的两个数,这两个数的和仍然等于之前的数
请问至少需要多少次操作才能将这n个数变成k个相等的数。

input

第一行是一个数t,代表有t组样例。(1≤T≤100)
每组样例的第一行是两个数n (1≤n≤10^5和 k(1≤k≤10^5)
接下来一行是n个数a0,a1,a2…an-1

output

对于每组样例,输出的格式是 ‘Case #x: y’,x代表这是第几个case,从1开始,y是最少的操作次数,
如果不能将这n个数变成相等的k个数,则y为-1.

题目解析

题目要求操作数最小,那么使用贪心的思想:使每一次分离操作都可以得到一或多个最终所要得到的那个平均数。

  • 这样考虑的话,我们对所给的数进行遍历,如果当前的数大于或等于平均数,则分出平均数,将剩下的加到下一个数据上。
  • 如果当前的数小于平均数则直接将这个数加到下一个数上

注意:该题的数据范围较大,将所有的数加到一起时,会超出 int 型的表示范围,所以应使用 long long 类型来保存数据

源代码(可AC)

#include<iostream>
#include<stdio.h>
using namespace std;
long long a[100010];
int main()
{
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值