POJ 2100 Graveyard Design 尺取法(滑动窗口)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/happy_Du/article/details/74937448

题目链接: 这里写链接内容
题目大意: 给出一个n,求连续递增数列的平方的和为n的所有情况。
input:n = 25
output:
2
2 3 4(2表示两个数)
1 5(1表示一个数)
题目分析:尺取法(也叫滑动窗口吧)模板。计算[s,t]之间的所有数字平方和sum,如果大于n,就s++,如果小于n,t++,每次更新sum,就好了。


Problem: 2100       User: ChenyangDu
Memory: 160K        Time: 3657MS
Language: C++       Result: Accepted
Source Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;

long long n;
struct node{
    long long l,s,t;
}ans[10000];

int ans_r = 0;

int main(){
    scanf("%lld",&n);
    long long s = 1,t = 1,sum = 1;
    while(t*t <= n){
        if(sum < n){
            t++;
            sum += t*t;
        }else if(sum > n){
            sum -= s*s;
            s++;
        }else{
            node &r = ans[ans_r++];
            r.l = t-s+1;
            r.s = s;
            r.t = t;
            sum -= s*s;
            s++;
        }
    }
    printf("%d\n",ans_r);
    for(long long i=0;i<ans_r;i++){
        node &r = ans[i];
        printf("%lld ",r.l);
        for(long long j = r.s;j<r.t;j++)
            printf("%lld ",j);
        printf("%lld\n",r.t);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/happy_Du/article/details/74937448