码迷,mamicode.com
首页 > 其他好文 > 详细

[JZOJ 5697] 农场

时间:2018-08-31 17:16:16      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:open   个数   ret   end   pac   ifd   amp   for   sum   

题目大意:将 n 个数 ai分成若干连续的段,使得每段的和都相等,求最多可以分成多少段。
思路:
考虑ai的和为sum,那么每一段的和就是约数。
对于每一个d,考虑其是否合法。
1e6之内用桶统计不会超时。

#include <bits/stdc++.h>
using namespace std;
int n;
int ans;
int sum;
int tong[1000010];
inline bool ok(int mid) {
    for(int i = 1;i <= sum / mid; ++i) {
        if(!tong[mid * i]) {
            return false;
        }
    }
    return true;
}
int main () {
    #ifdef ONLINE_JUDGE
        freopen("farm.in","r",stdin);
        freopen("farm.out","w",stdout);
    #endif
    scanf("%d",&n);
    for(int i = 1;i <= n; ++i) {
        int x;
        scanf("%d",&x);
        sum += x;
        tong[sum] = 1;
    }
    for(int i = 1;i <= sum; ++i) {
        if(sum % i == 0) {
            if(ok(i)) {
                ans = i;
                break;
            }
        }
    }
    printf("%d\n",sum / ans);
    return 0;
}

[JZOJ 5697] 农场

标签:open   个数   ret   end   pac   ifd   amp   for   sum   

原文地址:https://www.cnblogs.com/akoasm/p/9566249.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!