码迷,mamicode.com
首页 > 其他好文 > 详细

魔术球问题弱化版 题解

时间:2017-07-04 09:49:18      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:logs   oid   魔术   ons   描述   cst   贪心   style   pac   

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

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

 

题目描述

假设有 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

 

魔术球问题弱化版 题解

标签:logs   oid   魔术   ons   描述   cst   贪心   style   pac   

原文地址:http://www.cnblogs.com/shingen/p/7114863.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!