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

题目链接: 这里写链接内容
题目大意: 给出一个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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值