魔术球问题
贪心
反证法
放在旧的柱子上一定比新开一个优
#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\n",ans-1);
    for(int i=1;i<=n;i++){
        for(int j=0;j<d[i].size();j++)
        printf("%d ",d[i][j]);
        printf("\n");
    }
}
    我是咸鱼。转载博客请征得博主同意Orz
                    
                
                
            
        
浙公网安备 33010602011771号