链接:https://ac.nowcoder.com/acm/contest/10845/A
来源:牛客网
校园活动
题目描述
牛牛中学为了给本校的OIer放松心情,决定举报一场校园活动。
现在学校的共有 个OIer,学校想把他们分为一些小组进行一个团队游戏。学校先了解了一下每个同学对这个团队游戏的了解程度。
为了游戏的公平,学校需要使分组后的每一个小组内所有人对游戏的了解程度之和相等,
但同学们并不希望完全由学校来给他们分组,所以这 个人站为了一行,学校只能将队列中一段完整的子队列作为一个小组。
换句话说,如果你想让位置为 和 的人在一个小组里,你就必须让 和 之间的所有人在这个组里面。
当然,我们知道如果只有一个小组是无法进行游戏的。
你需要判断是否可以将他们成功分组进行游戏,如果能成功分组进行游戏就打印出最多能分为多少个小组,不能成功分组进行游戏(所有人都在同一个组里)打印“-1”。
输入描述:
共两行。
第一行一个整数 ,表示队列的长度( 2 <=n<=103 )
第二行是一个长度为 的队列,表示队列中每一个OIer对游戏的了解程度且每个人的了解程度在区间内。
输出描述:
如果能成功分组,打印出最多能分为多少个小组,不能成功分组(所有人都在同一个组里)打印“-1”。
解题思路: 因为n的取值范围不大,直接暴力O(n2)枚举,学生分组, 每个组的成员人数 r 都在max_i(学生中最大了解程度)到sum(所有学生了解程度之和,即所有人都在一个组)之间 (当时<=少些了一个等于号,导致所有学生了解程度都是0的情况直接输出了-1,提交了很多次才发现,蒟蒻)
代码如下:
#include <iostream>
using namespace std;
int a[10005];
int main()
{
int i,n,minn=99,maxx=1,r,lift,right,s=0,pos=1,flag=0,ans=0;
string str;
long long int sum=0;
cin>>n;
cin>>str;
for(i=1;i<=n;i++)
{
a[i]=str[i-1]-'0';
sum+=a[i];
if(a[i]<minn)
{
minn=a[i];
}
}
r=minn;
while(r<=sum)
{
s=0;
ans=0;
flag=0;
lift=1;
right=0;
for(i=1;i<=n;i++)
{
s+=a[i];
if(s==r)
{
s=0;
ans++;
}
if(s>r)
{
break;
}
}
if(flag==0&&(r*ans==sum))
{
if(ans>maxx)
{
maxx=ans;
}
}
r++;
}
if(maxx==1)
{
cout<<-1<<endl;
}
else {
cout<<maxx<<endl;
}
return 0;
}
示例1
输入
5
31113
输出
3