魔术球问题弱化版 题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了魔术球问题弱化版 题解相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

我也不知道这个问题是哪里来的,所以没有题目链接...但是文末会给出几组数据。

 

题目描述

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

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

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

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

例如,在 4 根柱子上最多可放 11 个球。

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

输入描述

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

输出描述

一行表示可以放的最大球数。

样例输入:4

样例输出:11

题目限制(为什么说弱化版就在这里)

N<=60

 

 

分析:

这题已经水得不要不要的......

贪心直接做就可以。每次都把新的数从第一个柱子开始放,合适的话就放下,不合适换下一个柱子。

上面的贪心证明起来难度很大,但是“看起来好像很对的样子”。

 

AC代码:

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 inline void read(int &x)
 7 {
 8     char ch = getchar();char c;x = 0;
 9     while(ch < 0 || ch > 9)    c = ch,ch = getchar();
10     while(ch >= 0 && ch <= 9)    x = x*10+ch-0,ch = getchar();
11     if(c == -)    x = -x;
12 }
13 const int MAXN = 300 ;
14 int post[MAXN];//记录某柱子最顶端的数字 
15 int main()
16 {
17     int n,x,ans = 0;
18     read(n);
19     int i = 1;
20     for(;;i ++)
21     {
22         for(int j = 1;j <= n;j ++)
23         {
24             x = sqrt(i + post[j]);
25             if(x*x == i+post[j] || post[j] == 0)
26             {
27                 ans ++;
28                 post[j] = i;
29                 break;
30             }
31             if(j == n)
32             {
33                 printf("%d",ans);
34                 return 0;
35             }
36         }
37     }
38 }

 

 

测试数据:

输入#1:10  输出#1:59

输入#2:17  输出#2:161

输入#3:50  输出#3:1299

输入#4:60  输出#4:1859

输入#5:1    输出#5:1

 

以上是关于魔术球问题弱化版 题解的主要内容,如果未能解决你的问题,请参考以下文章

魔术球问题

洛谷2765:[网络流24题]魔术球问题——题解

18.5.19 自测

网络流24题魔术球问题(最大流)

NOIP模拟 7.04

魔术球问题(网络流24题)