天天看點

九度oj 和為S的連續正數序列 1354 (機智DP) 好題

題目1354:和為S的連續正數序列

時間限制:2 秒

記憶體限制:32 兆

特殊判題:否

送出:2003

解決:618

題目描述:
小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正确答案是100。
但是他并不滿足于此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,
他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的
找出所有和為S的連續正數序列? Good Luck!
輸入:

輸入有多組資料。

每組資料僅包括1個整數S(S<=1,000,000)。如果S為負數時,則結束輸入。

輸出:
對應每組資料,若不存在和為S的連續正數序列,則輸出“Pity!”;否則,按照開始數字
從小到大的順序,輸出所有和為S的連續正數序列。每組資料末尾以“#”号結束。
樣例輸入:
4
5
100
-1      
樣例輸出:
Pity!
#
2 3
#
9 10 11 12 13 14 15 16
18 19 20 21 22
#      
//AC代碼。。      
#include <stdio.h>
int main()
{
    int low, high,flag;
    int sum, k;
    while( scanf("%d",&k) != EOF )
	{
        if( k<0 ) 
			break;
        low=1;  high=2;  flag=0; sum=3;
        while( low<high )
		{
            if( sum==k )
			{
                flag = 1;
                for( int i=low; i<=high; i++)
				{
                    printf("%d",i);
                    if( i==high ) 
						printf("\n");
                    else 
						printf(" ");
                }
                high++;
                sum+=high;
            }
			else if( sum>k )
			{
                sum -=low;
                low++;
            }
			else
			{
                high++;
                sum +=high;
            }
        }
        if( !flag ) 
			printf("Pity!\n");
        printf("#\n");
    }
    return 0;
}
           
//下面的是我寫的,TML代碼。唉,還是太年輕。技術不行。
#include<stdio.h>
#include<string.h>
#include<math.h>
int a[5000];
int b[5000];
int main()
{
	int n,m,i,j,sum;
	while(scanf("%d",&n)&&n>=0)
	{
		int k=0;
		for(i=1;i<=n/2;i++)
		{
			for(j=i+1;j<=(n+1)/2;j++)
			{
				if((i+j)*(j-i+1)==n*2)
				{
					a[k]=i;
					b[k++]=j;
					break;
				}
			}
		}
		if(k==0)
			printf("Pity!\n");
		else
		{
			for(i=0;i<k;i++)
			{
				for(j=a[i];j<b[i];j++)
					printf("%d ",j);
				printf("%d\n",b[i]);
			}
		}
		printf("#\n");
	}
	return 0;
}
           
//這個更機智。80Ms
#include <stdio.h>
#include <math.h>
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n>=0)
    {
        bool flag=true;
        int tmp=sqrt(2.0*n)+1;
        for(int i=tmp;i>=2;i--)
        {
            if(2*n%i==0)
            {
                int x=2*n/i+1-i;
                if(x%2==0&&x>0)
                {
                    flag=false;
                    x=x/2;
                    printf("%d",x);
                    for(int j=1;j<i;j++)
                        printf(" %d",x+j);
                    printf("\n");
                }
            }
        }
        if(flag)
            printf("Pity!\n");
        printf("#\n");
    }
    return 0;
}