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

xiaoxiao2021-02-28  83

题目链接: 这里写链接内容 题目大意: 给出一个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; }
转载请注明原文地址: https://www.6miu.com/read-46318.html

最新回复(0)