第七集,奇思妙想
经过一个比赛的小插曲后,小A不仅得到主办方的赏识后,还捞到了一大笔钱。有了足够的钱后,他继续出发前往那个聚会城市。由于小A和小C每天都需要赶路,他们需要多买一些舒适的袜子。在离开这个城市前,他先逛了一家袜子批发商店,该商店将不同数量的袜子放入一个个盒子中,且将盒子排成一排,小A看到这样的情景,顿时好奇(程序员的本能):
若把这些箱子围成一个圈,并且拿走一段连续的箱子,且箱子中的袜子的总数量正好等于小A要买的袜子的数量M,有多少种拿法?(假设有N个盒子,盒子编号1-N)、
同在小A和小C买完了袜子之后,继续朝着聚会城市出发…
Input
有多组测试案例,
每组测试案例,第一行输入一个正整数N,M(1<=N<=10^6, 1<=M<=10^8),表示有N个箱子。
第二行输入N个非负整数Ai(1<=Ai<=100)、分别表示连续箱子里面的袜子的数量、
Output
对于每组测试案例,输出有多少种方法、
SampleInput
2 1 1 1 3 2 1 1 1 3 3 1 1 1 3 1 1 1 1 3 5 1 1 1
SampleOutput
2 3 1 3 0
在做这题的时候因为是环形的不知道怎么处理 后来看了别人的代码发现在复制一下数组就好了
真是蠢哭hh
贴上代码
1 #include<stdio.h> 2 #define maxn 2000005 3 int s[maxn]; 4 void solve(int n,int m) 5 { 6 int l=1,r=1,sum=0,ans=0; 7 while(l<=n&&r<=l+n)///r不能超过l+n 即刚好找一圈 8 { 9 if(sum>=m) 10 { 11 if(sum==m) 12 ans++;///ans记录总共多少种情况 13 sum=sum-s[l]; 14 l++; 15 } 16 else 17 { 18 sum=sum+s[r]; 19 r++; 20 } 21 } 22 printf("%d\n",ans); 23 return; 24 } 25 int main() 26 { 27 int i,n,m,a; 28 while(~scanf("%d %d",&n,&m)) 29 { 30 int a=0; 31 for(i=1; i<=n; i++) 32 { 33 scanf("%d",&s[i]); 34 s[n+i]=s[i]; 35 a+=s[i];///环形再复制一圈 36 } 37 if(a==m) printf("1\n");///先判断 如果全部的和等于m 则只有一种情况 38 else if(a<m)printf("0\n");///如果全部的和小于m 说明一种都不存在 39 else 40 solve(n,m); 41 } 42 }