杭电2058

#include<stdio.h>  

int main()  

{  

    int i,j,sum=0;  

    int n,m;  

    while(scanf("%d%d",&n,&m)&&n!=0&&m!=0)  

    {     

    if(n>m)  

        break;  

    else  

    {  

        for(i=1;i<=n;i++)  

        {  

            sum=0;  

            for(j=i;j<=n;j++)  

            {  

                sum+=j;  

                if(sum==m)  

                {printf("[%d,%d]\n",i,j);  

                break;}  

            }  

        }  

    }  

    }  

  

}  

  这种办法是一一枚举的,但是会提示时间超过,不能通过

所以应该采用枚举法,但不是一一枚举

设开始的数为i,从i开始有j个数,所以m=[(i+i+j-1)/2]*j;(因为是连续的,就相当于公差为一的等差数列的求和,即为首项加上尾项的和除以项数),

同时反解出i=(2*m/j-j+1)/2

 1 #include<iostream>

 2 #include<cmath>

 3 using namespace std;

 4 int main()

 5 {

 6     int m,n,i,j;

 7     while(cin>>n>>m&&n||m)

 8     {

 9         for(j=(int)sqrt((double)(2*m));j>=1;j--)

10         {

11             i=(2*m/j-j+1)/2;

12             if((2*i+j-1)*j/2==m)

13                 cout<<'['<<i<<','<<i+j-1<<']'<<endl;

14         }

15 

16 cout<<endl;

17     }

18 }

 

超时的错误代码

你可能感兴趣的:(杭电)