Description
Input
Output
Sample Input
2 1 2
Sample Output
2 7
解题思路:
1递推递推,先分析下直线分割平面的情况,增加第n条直线的时候,跟之前的直线最多有n-1个交点,此时分出的部分多出了(n-1)+1;所以f[n]=f[n-1]+n-1+1;
2折线也是同理,f(1)=2,f(2)=7,先画好前面n-1条折线
当增加第n条拆线时,此时折线中的一条与图形的交点最多有2*(n-1)
因为n-1条折线相当于2*(n-1)条直线,那么一条折线就有2*2(n-1)个交点,
所以分出的部分多出了2*2(n-1)+1所以推出f(n)=f(n-1)+4*(n-1)+1,n>=2
还有f[n]=n(2n-1)+1,这是从递推公式中推出来的;
Description
Input
Output
Sample Input
2 1 2
Sample Output
2 8
3 三角形也去递推,f[1]=2;f[2]=8;增加的交点和增加的部分相同
平面本身是1部分.一个三角形将平面分成三角形内、外2部分,即增加了1部分,
两个三角形不相交时将平面分成3部分,相交时,交点越多分成的部分越多(见下图);
当增加第n个三角形时,三角形的一条边只能跟别的三角形的两条边相交
那么交点就增加了2(n-1),三条边就增加了3*2(n-1)个交点
所以推出f[n]=f[n-1]+6*(n-1);
另外,因为1个三角形时有2部分,所以n个三角形最多将平面分成的部分数是:
2+6×[1+2+…+(n-1)]=2+3n(n-1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#include<stdio.h> int main() { int n,m,i,a[10010]; a[1]=2;a[2]=8; for(i=3;i<=10000;i++) a[i]=a[i-1]+6*(i-1); scanf("%d",&n); while(n--) { scanf("%d",&m); printf("%d\n",a[m]); } return 0; }
Description
Input
Output
Sample Input
2 1 2
Sample Output
2 7
解题思路:
1递推递推,先分析下直线分割平面的情况,增加第n条直线的时候,跟之前的直线最多有n-1个交点,此时分出的部分多出了(n-1)+1;所以f[n]=f[n-1]+n-1+1;
2折线也是同理,f(1)=2,f(2)=7,先画好前面n-1条折线
当增加第n条拆线时,此时折线中的一条与图形的交点最多有2*(n-1)
因为n-1条折线相当于2*(n-1)条直线,那么一条折线就有2*2(n-1)个交点,
所以分出的部分多出了2*2(n-1)+1所以推出f(n)=f(n-1)+4*(n-1)+1,n>=2
还有f[n]=n(2n-1)+1,这是从递推公式中推出来的;
Description
Input
Output
Sample Input
2 1 2
Sample Output
2 8
3 三角形也去递推,f[1]=2;f[2]=8;增加的交点和增加的部分相同
平面本身是1部分.一个三角形将平面分成三角形内、外2部分,即增加了1部分,
两个三角形不相交时将平面分成3部分,相交时,交点越多分成的部分越多(见下图);
当增加第n个三角形时,三角形的一条边只能跟别的三角形的两条边相交
那么交点就增加了2(n-1),三条边就增加了3*2(n-1)个交点
所以推出f[n]=f[n-1]+6*(n-1);
另外,因为1个三角形时有2部分,所以n个三角形最多将平面分成的部分数是:
2+6×[1+2+…+(n-1)]=2+6×
n(n-1) |
2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#include<stdio.h> int main() { int n,m,i,a[10010]; a[1]=2;a[2]=8; for(i=3;i<=10000;i++) a[i]=a[i-1]+6*(i-1); scanf("%d",&n); while(n--) { scanf("%d",&m); printf("%d\n",a[m]); } return 0; }