各位请问这里为什么超时?
鸡蛋
一天白雪公主来到超市为七个小矮人买鸡蛋,这里的鸡蛋都包装在篮子里,每个篮子的鸡蛋数都不相同。这些篮子排成一行,白雪公主要买其中连续的一段。不过为了每个小矮人分的鸡蛋数一样,有一个条件:这连续一段篮子的鸡蛋数的和要能被7整除。
现在知道n个篮子的每一个里面鸡蛋数,问白雪公主有多少种购买方案?
#include
using namespace std;
int a[100005]
int main()
{
int N,i,j,k,sum=0,count=0;
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=1;i<N;i++)
{
for(j=0;j<N-i+1;j++)
{
sum = 0;
for(k=j;ksum+=a[k];
if(sum%7==0)
count++;
}
}
printf("%d",count);
return 0;
}
一共四个测评点,3个没错,一个超时。
给个样例啊,再说,三个循环嵌套着,n是1000的话,就一定超时了
我找到了范围,是100000。
#include <stdio.h>
#define MAX_N 100000
using namespace std;
int n;
int a[MAX_N + 5];
int c[7];
long long ans;
inline long long C(long long x)
{
return x * (x + 1) >> 1;
}
int main()
{
scanf("%d",&n);
for(register int i = 1; i <= n; ++i)
{
scanf("%d",&n);
a[i] = (a[i] + a[i - 1]) % 7;
++c[a[i]];
}
for(register int i = 0; i < 7; ++i)
{
ans += C(c[i] - (i > 0));
}
printf("%d",ans);
return 0;
}
三个for循环嵌套,时间复杂度有点高了
两重循环
int a[100005];
int main()
{
int N,sum=0,count=0,i=0,j=0;
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N;i++)
{
sum = 0;
for(j=i;j<N;j++)
{
sum += a[j];
if(sum%7==0)
count++;
}
}
printf("%d\n",count);
return 0;
}