【AcWing】4366.上课睡觉

题目描述

在这里插入图片描述

解题思路

整体思路:

  1. 性质:要实现最终每一堆的数量相同,那么每一堆的石子数量必须能够整除所有石子数量。
  2. 把所有石子的数量求和(sum),并统计最多一堆石子的数量。
  3. 因为只能合并成sum的因子,所以可以从小到大遍历sum的因子。
  4. 判断因子的合法性:遍历每堆石子将其合并,如果某些连续的石子合并起来等于其因子,就继续合并下一堆;如果某些连续的石子大于其因子,直接遍历判断下一个因子。

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int w[N];

// 检查因子是否合法
bool check(int cnt)
{
    
    
    for (int i = 0, s = 0; i < n; i ++)
    {
    
    
        s += w[i];
        if (s > cnt) return false;
        if (s == cnt) s = 0;
    }
    return true;
}

int main()
{
    
    
    int T;
    cin >> T;
    while (T --)
    {
    
    
        cin >> n;
        int sum = 0;
        for (int i = 0; i < n; i ++)
        {
    
    
            cin >> w[i];
            sum += w[i];
        }
        for (int i = n; i; i --)
            // sum / i 表示sum的一个因子
            if (sum % i == 0 && check(sum / i))
            {
    
    
                cout << n - i << endl;
                break;
            }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/laaa123mmm/article/details/128746430
今日推荐