链接:https://ac.nowcoder.com/acm/contest/10845#question
坑点:输入的是字符串!!!!
思路:如果每一个数都为0,则可以分成n组(每一个人是一组)
先把了解程度为0的都去掉(没用)
了解程度最小为n个数中的最大值mx,最大为所有人了解程度之和sum减1
若在这个区间内没有分成,则输出-1。
完整代码:
#include<cstdio>
#include<cstring>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int N=1e3+10;
int n,a[N],ans[N],k,b[N],tot=0;
char ch[N];
int solve(int x)///判断数组能不能分成每一份都是x
{
int p=0;
for(int i=1; i<=tot;)
{
while(ans[i]-p<x&&i<=tot)
i++;
if(ans[i]-p==x)
k++,p=ans[i],i++;
else
return false;
}
return true;
}
int main()
{
scanf("%d",&n);
scanf("%s",ch);
for(int i=0;i<n;i++)
a[i+1]=ch[i]-'0';
int mx=0,sum=0;
ans[0]=0;
for(int i=1; i<=n; i++)
{
mx=max(mx,a[i]);
sum+=a[i];
if(a[i]!=0)
b[++tot]=a[i];
}
for(int i=1;i<=tot;i++)
ans[i]=ans[i-1]+b[i];
///最小了解程度为mx,最大为sum
int flag=0;
if(sum==0)
{
printf("%d\n",n);
return 0;
}
for(int i=mx; i<sum; i++)
{
k=0;
if(solve(i))
{
flag=1;
//printf("i-->%d\n",i);
break;
}
}
if(flag==1)
printf("%d\n",k);
else
printf("-1\n");
return 0;
}

京公网安备 11010502036488号