zoukankan      html  css  js  c++  java
  • P1147连续自然数和-(尺取法)

    https://www.luogu.org/problemnew/show/P1147

    题意:输入一个n,求连续几个数加起来等于n,输出这几个连续的数的第一个和最后一个。10<=n<=2000 000

    由于n巨大,双重暴力显然超时,网上有很多通过长度用公式的写法,没想到一个等差能被翻出很多花样,深表佩服。

    不过那些看起来很nb的公式我是推不出来,还是用尺取法靠谱点,时间复杂度也是O(n)

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<math.h>
    #include<map>
    #include<string>
    #define ll long long
    #define inf 0x3f3f3f3f
    using namespace std;
    
    int n;
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            int m=n/2;
            int l=1,r=2;
            int sum=3;
            while(l<=m)
            {
                if(sum==n)
                {
                    printf("%d %d
    ",l,r);///如果相同,sum先减左指针再移动 或者 右指针先移动再加到sum里
                    r++;
                    sum+=r;
                    /*
                    sum-=l;
                    l++;*/
                }
                else if(sum<n)
                {
                    r++;
                    sum+=r;///右指针先移动再加到sum里
                }
                else
                {
                    sum-=l;
                    l++;///sum先减左指针再移动
                }
            }
        }
        return 0;
    }
    P1147
  • 相关阅读:
    Struts2 Hello World
    Struts2入门(1)
    Struts2_day01
    Java Web Model2实战
    Oracle_day04
    SAP调用外部webservice接口
    通用清账程序
    服务器IDOC文件解析程序
    IDOC接口创建步骤
    SAP 本地发送IDOC
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/10640132.html
Copyright © 2011-2022 走看看