zoukankan      html  css  js  c++  java
  • P2765 魔术球问题

    题目描述

    «问题描述:

    假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为123...的球。

    (1)每次只能在某根柱子的最上面放球。

    (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数。

    试设计一个算法,计算出在n根柱子上最多能放多少个球。例如,在4 根柱子上最多可放11 个球。

    «编程任务:

    对于给定的n,计算在n根柱子上最多能放多少个球。

    输入输出格式

    输入格式:

    第1 行有1个正整数n,表示柱子数。

    输出格式:

    程序运行结束时,将n 根柱子上最多能放的球数以及相应的放置方案输出。文件的第一行是球数。接下来的n行,每行是一根柱子上的球的编号。

    输入输出样例





    输入样例#1:
    4
    输出样例#1:
    11
    1 8
    2 7 9
    3 6 10
    4 5 11

    说明

    感谢 @PhoenixEclipse 提供spj

    4<=n<=55
    两种方法
    1

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN=100;
    vector<int >a[MAXN];
    int n;
    bool check(int a,int b)
    {
        if((int)sqrt(a+b)*(int)sqrt(a+b)==(a+b))
            return true;
        return false;
    }
    int main()
    {
        scanf("%d",&n);
        for (int i = 1; i <=n ; ++i) {
            a[i].clear();
        }
        int x=1;
        while(1){
            int i=1;
            while(i) {
                if(a[i].empty()) {
                    a[i].push_back(x);
                    break;
                } else
                {
                    int z=a[i].back();
                    if(check(z,x)){
                        a[i].push_back(x);
                        break;
                    }
                }
                i++;
                if(i>n)
                    break;
            }
            x++;
            if(i>n)
                break;
        }
        printf("%d
    ",x-2);
        for (int i = 1; i <=n ; ++i) {
            int k=a[i].size();
            for (int j = 0; j <k ; ++j) {
                cout<<a[i][j]<<' ';
            }
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    第十三周助教总结
    C语言I博客作业09
    第十二周助教总结
    C语言I博客作业08
    第十一周助教总结
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I作业07
    C语言I作业06
  • 原文地址:https://www.cnblogs.com/-xiangyang/p/9220231.html
Copyright © 2011-2022 走看看