[JZOJ 5697] 农场

题目大意:将 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;
}
原文地址:https://www.cnblogs.com/akoasm/p/9566249.html