校园活动
牛牛中学为了给本校的OIer放松心情,决定举报一场校园活动。
现在学校的共有 个OIer,学校想把他们分为一些小组进行一个团队游戏。学校先了解了一下每个同学对这个团队游戏的了解程度。
为了游戏的公平,学校需要使分组后的每一个小组内所有人对游戏的了解程度之和相等,
但同学们并不希望完全由学校来给他们分组,所以这 个人站为了一行,学校只能将队列中一段完整的子队列作为一个小组。
换句话说,如果你想让位置为 x和 y(x<y) 的人在一个小组里,你就必须让x 和y
之间的所有人在这个组里面。
当然,我们知道如果只有一个小组是无法进行游戏的。
你需要判断是否可以将他们成功分组进行游戏,如果能成功分组进行游戏就打印出最多能分为多少个小组,不能成功分组进行游戏(所有人都在同一个组里)打印“-1”。
如果能成功分组,打印出最多能分为多少个小组,不能成功分组(所有人都在同一个组里)打印“-1”。
输入
5
31113
输出
3
解题思路:
题目的意思是把整个队列分成多个连续,数量可不相等的小组,所有小组的总和相等
∴我们不妨先将字符串转换为对应的数组,在转换的过程中记录一下了解程度之和
然后假设能分成x组,然后看一下每组能不能分到一个整数(sum%x==0)
如果可以,再进行判定,定义一个变量为每组分配的了解程度,如果出现大于了该变量,说明不匹配,减少组数继续判定
如果不存在这种情况,那么在最后输出-1
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
int b[2001];
int sum;
int main() {
int n;
scanf("%d",&n);//输入数据
getchar();//把空格读了,防止读不到字符串
string a;
getline(cin,a);
for(int i=0; a[i]; i++) {
b[i]=a[i]-'0';//处理字符串
sum+=b[i];
}
for(int i=n; i>1; i--) {
//不能等于1,因为不能只分一个组
if(sum%i==0) {
int t=sum/i;//每个组分配的了解程度
int count=0,flag=0;
for(int j=0; j<n; j++) {
count+=b[j];
if(count==t) {
count=0;
continue;
}
if(count>t) {
//大于则排除这种情况
flag=1;
break;
}
}
if(flag==0) {
printf("%d",i);//输出答案,结束程序
return 0;
}
}
}
printf("-1");//没有结束说明不存在,输出-1
}
#include <iostream>
#include <cstring>
using namespace std;
int cx[2001];
int main() {
int n;
cin>>n;
getchar();
string a;
getline(cin,a);
for(int i=0; i<a.size(); i++)
cx[i]=a[i]-'0';
int sum=0;
for(int i=0; i<a.size(); i++)
sum+=cx[i];
for(int i=n; i>=1; i--) {
if(i==1) {
cout<<"-1";
return 0;
}
if(sum%i==0) {
int t=sum/i;
int count=0;
int flag=0;
for(int k=0; k<a.size(); k++) {
count+=cx[k];
if(count==t) {
count=0;
continue;
}
if(count>t) {
flag=1;
break;
}
}
if(flag==0) {
cout<<i;
return 0;
}
}
}
}
附:初来乍到,如果有不足之处,恳请各位大牛指正,如果题解有错误或者没写清楚的地方也欢迎在评论区提问~