The sum problem
Time Limit:
5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 11869 Accepted Submission(s):
3582
Problem Description
Given a sequence 1,2,3,......N, your job is to calculate all
the possible sub-sequences that the sum of the sub-sequence is
M.
Input
Input contains multiple test cases. each case contains two
integers N, M( 1 <= N, M <=
1000000000).input ends with N = M = 0.
Output
For each test case, print all the possible sub-sequence that
its sum is M.The format is show in the sample below.print a blank
line after each test case.
Sample Input
20
10
50
30
0 0
Sample Output
[1,4]
[10,10]
[4,8]
[6,9]
[9,11]
[30,30]
Author
8600
思路:
一眼看出,不用多说,一道水题,
1.输出对于M来说,从1到N中,连续的数组,是否和刚好是M的,如果是立即输出,格式为[X,X]
2.每一个例子之间要有换行
3.遇0 0结束
估计用暴力比较不可能,但是我不信,结果WA了
WA 代码如下:
#include
int main()
{
__int64n,m,i,j,sum;
while(~scanf("%I64d%I64d",&n,&m))
{
if(n==0&&m==0)
break;
for(i=1;i<=m;i++)
{
sum=0;
for(j=i;j<=m;j++)
{
sum+=j;
if(sum==m)
{
printf("[%d",i);
printf(",%d]\n",j);
}
if(sum>m)
break;
}
}
printf("\n");
}
return0;
}
应该是数据量太大了,N和M有1000000000,肯定超时,时间复杂度为O(n^2)
那我们就应该采取一些方法去改进其算法的复杂度
1.确定对于M来说,最多有几种情况,要确定
2.通过求和公式得出,在已知的情况中,去搜索具体值,通过(首项+末项)*项数/2
AC代码如下:
#include
#include
intN,M;
int main()
{
intflag=0,i,len,temp;
while(scanf("%d %d", &N, &M) && (M||N))
{
len=(sqrt(M*2.0));
for(i=len;i>=1;--i)
{
temp=M-(i*i+i)/2;
if(temp%i==0)
printf("[%d,%d]\n",temp/i+1,temp/i+i);
}
printf("\n");
}
return0;
}
原创勿抄袭,后果请自负