问题描述
nodgd小时候是个熊孩子,每次惹了祸都需要家长去赔礼道歉。久而久之,家长就积累除了经验,只要说“他还是个孩子,不懂事,您就别计较了”,对方就只得作罢。
有一次nodgd参加小伙伴的生日聚会,小伙伴买了个很大的蛋糕准备分给参加聚会的每个人吃。nodgd熊性大发,抢过蛋糕,亲自操刀,刀法精湛,巧夺天工。
蛋糕的俯视图是一个圆。nodgd首先在圆周上标记了n个点,然后在任意两个点之间都切下笔直的一刀,把蛋糕切成了很多份。下图中分别是nodgd在n=2,3,4,5的时候切蛋糕的结果。
nodgd的刀法足够精湛,切蛋糕的过程中蛋糕不会散架。nodgd并不关心这样切出来的每一份蛋糕形状如何、大小是否相等、是否好吃,只关心最多能够切出多少份蛋糕。
输入格式
输入一行,只有一个整数n,表示nodgd在圆周上标记的点数。
输出格式
输出一行,一个整数,表示nodgd最多可以把蛋糕切成多少分。
样例输入 1
3
样例输出 1
4
样例输入 2
4
样例输出 2
8
样例输入 3
5
样例输出 3
16
数据与提示
对于100%的数据,2≤n≤60。
分析:
刚开始,我做的时候,一直找不到规律,后来我经过尝试,终于发现了规律。
如上图所示,令点数用i,块数用a[i],块数之差用b[i],块数之差的差用c[i],所以a[2]=2,b[2]=2,c[2]=2
经过观察,我们可以发现c[i]=c[i-1]+i-1,b[i]=b[i-1]+c[i-1],a[i]=a[i-1]+b[i-1]。我们发现了规律,就可以写代码了
代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[65],b[65],c[65];
int main(){
scanf("%d",&n);//输入
a[2]=2;
b[2]=2;
c[2]=2;//初始化
for(int i=3;i<=n;i++){//循环求a[n]
c[i]=c[i-1]+i-1;
b[i]=b[i-1]+c[i-1];
a[i]=a[i-1]+b[i-1];//规律
}
printf("%d",a[n]);//输出
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------
点赞+关注,刷题不迷路!!!!!!!!!!!!!!!!!!
---------------------------------------------------------------------------------------------------------------------------------