【Acwing寒假2023每日一题】4366. 上课睡觉 - 枚举

4366. 上课睡觉 - AcWing题库

思路:

我们可以从大到小枚举最后分成的堆数 最后分成的堆数越多 操作数越小

sum可以整除堆数 且 sum能被均分成cnt个/堆

如何判断sum能不能被均分成cnt个/堆?

因为题目说能合并的石头堆是相邻的 所以依次枚举数组

s+=a[i]

  • 如果s==cnt 则s=0
  • 如果s>cnt 再继续加的话只会越来越大 所以这种情况无法相邻合并 即无解 return false
  • 如果枚举完整个数组 说明可以被均分成cnt个/堆 return true
import java.util.*;

class Main
{
    static int N=1000010;
    static int[] a=new int[N];
    static int n;
    
    public static boolean ck(int cnt)
    {
        for(int i=0,s=0;i<n;i++)
        {
            s+=a[i];
            if(s>cnt) return false;
            if(s==cnt) s=0;
        }
        return true;
    }
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        while(t-->0)
        {
            n=sc.nextInt();
            int sum=0;
            for(int i=0;i<n;i++)
            {
                a[i]=sc.nextInt();
                sum+=a[i];
            }
            for(int i=n;;i--) //枚举堆数 堆数越大 操作数越小
                if(sum%i==0&&ck(sum/i)) 
                {
                    System.out.println(n-i);
                    break;
                }
        }
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值