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