魔术球问题

贪心
反证法
放在旧的柱子上一定比新开一个优

#include <cstring>
#include <cstdio>
#include <vector>
std::vector<int> d[60];
int n,ans=1,cnt;
bool sqr[5005];
int main() {
    scanf("%d",&n);
    for(int i=1;i*i<=5000;i++) sqr[i*i]=1;
    while(1){
        for(int i=1;i<=cnt;i++){
            if(sqr[d[i][d[i].size()-1]+ans]){d[i].push_back(ans);ans++;i=0;continue;}
        }
        if(cnt<n) d[++cnt].push_back(ans++);else break;
    }
    printf("%d
",ans-1);
    for(int i=1;i<=n;i++){
        for(int j=0;j<d[i].size();j++)
        printf("%d ",d[i][j]);
        printf("
");
    }
}
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9266161.html