校园活动
题目描述
牛牛中学为了给本校的OIer放松心情,决定举办一场校园活动。
现在学校的共有 个OIer,学校想把他们分为一些小组进行一个团队游戏。学校先了解了一下每个同学对这个团队游戏的了解程度。
为了游戏的公平,学校需要使分组后的每一个小组内所有人对游戏的了解程度之和相等,
但同学们并不希望完全由学校来给他们分组,所以这 n n n个人站为了一行,学校只能将队列中一段完整的子队列作为一个小组。
换句话说,如果你想让位置为 x x x和 y y y ( x < y ) (x < y) (x<y)的人在一个小组里,你就必须让 和 之间的所有人在这个组里面。
当然,我们知道如果只有一个小组是无法进行游戏的。
你需要判断是否可以将他们成功分组进行游戏,如果能成功分组进行游戏就打印出最多能分为多少个小组,不能成功分组进行游戏(所有人都在同一个组里)打印“-1”。
输入描述:
共两行。
第一行一个整数 ,表示队列的长度 ( 2 ≤ n ≤ 1 0 3 ) ( 2 \le n \le 10^3 ) (2≤n≤103)
第二行是一个长度为 的队列,表示队列中每一个OIer对游戏的了解程度且每个人的了解程度在区间内。
输出描述:
如果能成功分组,打印出最多能分为多少个小组,不能成功分组(所有人都在同一个组里)打印“-1”。
示例1
输入
5
31113
输出
3
解题思路分析
试除法确定分组的个数,对队列的元素求和得到sum,假设一开始分组的个数是i = sum
,那么 sum / i
得到每个组内的元素和都是1,也就是样例1111
这种情况,显然最大分组是4;然后让i不断的减1,直至到i = 2
,就可以枚举出所有的分组;注意特判全0的情况,如0000
的分组个数应该是4。
#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<map>
#include<unordered_map>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
const int MAXN = 1e6 + 50;
const int MOD = 1e9 + 7;
const double eps = 1e-9;
const int INF=0x3f3f3f3f;
#define PI acos(-1)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,x) for(int i=0;i<x;++i)
#define UP(i,x,y) for(int i=x;i<=y;i++)
#define DOWN(i,x,y) for(int i=x;i>=y;i--)
#define DEBUG(x) cout << "#: " << (x) << endl
const int maxn = 1e3 + 50;
int a[maxn];
int n;
string s;
void Solve(){
int T = 1; //cin >> T;
while(T--){
cin >> n;
cin >> s;
int idx = 0,sum = 0;
for(auto x : s){
a[idx++] = (x - '0');
sum += (x - '0');
}
//DEBUG(sum);
int mx = 0;
if(sum == 0) { //特判全0的情况
cout << n << endl;
}
else{
for(int i = sum; i >= 2; i--){
if(sum % i != 0) continue;
int cur = sum / i;
int t = 0, cnt = 0;
for(int j = 0; j < n; j++){
t += a[j];
if(t > cur) {
cnt = 0;
break;
}
if(t == cur) {
t = 0;
cnt++;
}
}
mx = max(mx,cnt);
}
//cout << "answer:";
if(mx == 0) cout << "-1" << endl;
else cout << mx << endl;
}
}
}
int main(){
Solve();
return 0;
}