noip第16课作业

1. 猴子吃桃

【问题描述】

猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共摘了多少个桃子?

#include <iostream>
using namespace std;
int peach(int n)
{
    if (n == 10)
        return 1;
    else
        return 2 * (peach(n + 1)+1);
}
int main()
{
    int sum;
    sum=peach(1);
    cout << sum << endl;
    return 0; 
} 

2.乘火车

【问题描述】

火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。现给出的条件是:共有n个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问第x站开出时车上的人数是多少? 
【输入格式】: —行四个整数a, n, m和x (中间用空格隔开)

0 <= a <= 10, 3 <= x < n <= 15, 0 <= m <= 10000。
【输出格式】 —行一个整数(从x站开出时车上的人数)

【样例输入】

  4  6   32   4

【样例输出】

  18

#include <iostream>
using namespace std;
int b[20]= {0,1,1};
int main() {
    //a上车人数  n共有n个车站
    //m最后一站车上的人数 
    //x第几站开出 
     
    int a,n,m,x,i,k=0;
    cin >> a >> n >> m >> x;
    
    if(x==1) {
        cout << a;
        return 0;
    }
    for(i=3; i<20; i++){
        b[i]=b[i-1]+b[i-2];
    }
    if(n>4){
        k=(m-(b[n-3]+1)*a)/(b[n-2]-1); 
    }
    cout << (b[x-1]-1)*k+(b[x-2]+1)*a;
    return 0;
}

1.纸的折痕

【问题描述】

将一张长方形的纸对折,可得到一条折痕,继续对折,对折时每次折痕与上次的折痕保持平行,连续对折三次后,可得到7条折痕,那么对折n次,可得到几条折痕?

【输入格式】一个整数n,表示对折的次数。

【输出格式】输出得到折痕的数目。

【样例输入】

3

【样例输出】

7

#include<iostream>
using namespace std; 
int main(){
    int n, a[100]={0};
    int m = 2;
    cin >> n;
    a[1] = 1;
    for(int i = 2; i <= n; i++){
        a[i] = a[i-1] + m; 
        m = m * 2;
    }
    cout << a[n] << endl;
    return 0;
}

2.平面分割

【问题描述】

同一平面内有n(n≤500)条直线,已知其中p(p≥2)条直线相交于同一点,则这n条直线最多能将平面分割成多少个不同的区域?

【输入格式】

 两个整数n(n≤500)和p(2≤p≤n)。

【输出格式】

  一个正整数,代表最多分割成的区域数目。

【输入样例】

12  5

【输出样例】

73

#include<iostream>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    int total=2*m;
    for (int i=m+1;i<=n;i++)
    total+=i;
    cout<<total;
    return 0; 
}

3.Catalan数

【问题描述】

Catalan数首先是由Euler在精确计算对凸n边形的不同的对角三角形剖分的个数问题时得到的,它经常出现在组合计数问题中。

问题的提出:在一个凸n边形中,通过不相交于n边形内部的对角线,把n边形拆分成若干三角形,不同的拆分数目用hn表示,hn即为Catalan数。例如五边形有如下五种拆分方案(如下图),故h5=5。求对于一个任意的凸n边形相应的hn

【输入样例】

10

【输出样例】

1430

#include <iostream>
using namespace std;
int a[100];
int f(int x){
    int sum=0;
    if (a[x]!=0){
        return a[x];
    }else{
        for (int i=2;i<=x-1;i++){
            sum=sum+f(i)*f(x-i+1);
        }
        return a[x]=sum;
    }
}
int main(){
    int n;
    a[2]=1;
    a[3]=1;
    cin>>n;
    cout<<f(n);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zhplovelnn/p/10383157.html
今日推荐