题目描述:给出正整数n,求有多少组完全平方数的和恰好为n
题解:一般对于结果单调,且求恰好等于某个数的问题,采取尺取法解决,即左右区间先后移动,一定程度上有贪心的意味。
而对于求某个变量的最值,则采取二分法,相同点都是维护l,r的区间。
参考程序:
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long LL;
LL n;
vector<pair<int,int> >result;
int main(){
while (scanf("%lld",&n)==1){
LL l=1,r=1,sum=0;
for (;;){
while (sum<n){
sum+=r*r;
r++;
}
if ((r-1)*(r-1)>n)break;
if (sum==n)
result.push_back(make_pair(l,r));
sum-=l*l;
l++;
}
printf("%d\n",result.size());
for (int i=0;i<result.size();i++){
printf("%d ",result[i].second-result[i].first);
for (int j=result[i].first;j<result[i].second;j++)
printf("%d ",j);
printf("\n");
}
}
return 0;
}