黑皮的蛋糕

描述

时间限制 1000 ms
内存限制 128 MB
题目描述
众所周知,黑皮出生于1000年01月01日,那天乌云密布,电闪雷鸣,在黑光划破夜空的一瞬间,黑皮准确无误的生成了男孩。不妨给大家说声:由于他天生体黑,故取名为黑皮。-
为了庆祝黑皮的1006岁生日,也就是2006年01月01日。校长为他在学校里举行一个名为{天造奇才}的大型庆祝活动。邀请全校的师生及其家属们都参加。考虑到当时人数相当庞大,黑皮的好友小佳佳特地为他从美国进口了个超级无敌五香麻辣阴阳五行令万千饿鬼为之绝倒的巨无霸大蛋糕1号。供到场的所有人享用。
黑皮也考虑到人数太多,蛋糕又只有一个。所以决定自己用在最少的刀数划出最多的蛋糕份数。比如说:开始是1个蛋糕,份数为1;黑皮一刀子划下去,刀数为1,份数就为2了;再一刀,刀数为2,份数为4;再一刀………………若干刀下去,份数就为n了。
黑皮当时,千心万苦终于划了出来。他想知道你们是否也能划出来。-

输入数据
输入一个数,即为黑皮当时划的刀数 n 。 0≤ n≤ 34567890;
输出数据
一个数,即为到场人数。已知人数与黑皮划下来的份数相同。
样例输入
2
样例输出
4
样例说明
由于上次的题目《黑皮的正方形》(p1307)一些描述给大家带来的不便,请大家谅解。这个题应该不会了吧。嘿嘿…………
这个题和上次的一样简单,希望大家不要B视我。我很弱啊~
争取100%的正确率。谢谢-
(我怕会超时,改了时间)

解析:刚拿到题目,最简单也是最愚蠢的想法就是,2n,too young too simply,仔细读题目,要求最少的刀数切出最多的份数,这个才是问题的关键。
一开始我是在纸上画出一个圆形蛋糕(其实不一定是圆形,题目给的是无穷大,不要让固定思维局限了自己的思维),尽可能的画出多的份数,但是毕竟自己画的圆大小有限,而且随手的草稿也很难画出复杂的情况
在这里插入图片描述
会发现,每画一条新的线n都会与其他n-1条线相交,如果圆够大,其实红色的这条线,会多分出5份蛋糕.
这里补充一个知识:线切面
(1) n条直线最多分平面问题
题目大致如:n条直线,最多可以把平面分为多少个区域。
析:可能你以前就见过这题目,这充其量是一道初中的思考题。但一个类型的题目还是从简单的入手,才容易发现规律。当有n-1条直线时,平面最多被分成了f(n-1)个区域。则第n条直线要是切成的区域数最多,就必须与每条直线相交且不能有同一交点。 这样就会得到n-1个交点。这些交点将第n条直线分为2条射线和n-2条线断。而每条射线和线断将以有的区域一分为二。这样就多出了2+(n-2)个区域。
故:f(n)=f(n-1)+n
=f(n-2)+(n-1)+n
……
=f(1)+1+2+……+n
=n(n+1)/2+1

嗯,所以这道题的答案就是:

#include<iostream>
using namespace std;
int main( )
{
    int n;     //这里也可以写成long,但是int 也没有错
    long ans = 1 ;    //这里一定是long
    cin>>n ;
    for(int i=1;i<=n;i++){
        ans += i ;
    }
    cout<<ans<<endl ;
    return 0;
}

还有很多人是下面这种写法,提交也没有问题(我其实不太理解这种写法,可能是找规律吧)

#include<iostream>
using namespace std;
int main( )
{
    long n;
    while(cin>>n)
   {
        if(n%2==0)
            n=1+n/2*(n+1);
        else
            n=1+(n+1)/2*n;
        cout<<n<<endl;
   }
    return 0;
}

算法小白,请多指教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值