被打脸的潇洒哥(推递推式)
链接:https://ac.nowcoder.com/acm/contest/318/M
来源:牛客网
在一次青青草原ACM个人赛中,潇洒哥被喜洋洋以30s罚时压制,委屈的当了个第二。潇洒哥蹲在角落说出了他的口头禅,并画起了圈圈。
突然,他想出了一个有趣的题目,跑去给喜洋洋做。喜洋洋看到题目后懵逼了,但是看到潇洒哥脸上欠揍的笑容就不爽,暗想一定要做出来狠狠的打潇洒哥的脸。
于是,他以上厕所为名义跑出来用手机把题目发给了你,希望你能帮你做出来让他可以嘲讽潇洒哥。
你收到的题目如下:
平面上有n个圆,求使这n个圆两两相交(即每两个圆之间恰好有两个交点)后最多能把平面划分成多少个区域。
输入描述:
一个正整数t,表示有t(1≤t≤100)组数据。 接下来t行,每行一个整数n(0≤n≤1000),代表平面内圆的个数。
输出描述:
输出共t行。每行一个正整数,表示对应的n个圆将该平面划分成的最大的区域数。
示例1
输入
3 1 2 3
输出
2 4 8
说明
第一个样例,平面只有一个圆,此时将平面划分成圆内和圆外两个区域;
第二个样例,平面上有两个圆,两圆相交可以将平面划分成四个区域(见下图)。
题解:我是根据交点来推的,1个圆为0个交点,2个圆为2个交点,3个圆为6个。。。。。然后就可以推出来每次在原来的基础上多了(n-1)*2个交点,也就是多了这么多的交点,这个题的坑点在于0,一开始的提交没考虑到0个圆,第二次想错了,以为0个的时候平面是0,其他基本很简单
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
long long int sum[1005]={0};
sum[0]=1;
sum[1]=2;
for(int t=2;t<=1000;t++)
{
sum[t]=sum[t-1]+(t-1)*2;
}
int T;
cin>>T;
//int a[105];
for(int t=0;t<T;t++)
{
int n;
scanf("%d",&n);
printf("%lld\n",sum[n]);
}
return 0;
}
作者:李斌
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!