新生22场

数字三角

中山市迎接2010年亚运会活动将要在兴中体育场举行,市教育局为每个学校安排了一个区域,每个学校的同学都要坐在自己学校的区域内。
分给成功小学的区域是个等边三角型,这不是不重视成功小学,而是把难题给了成功小学,就是因为成功小学的同学更加优秀,因此这点小问题是难不倒他们的。大家根据座位区域,一下就设计出了以下座位安排方案:
新生22场
……
我们可以看出,1号同学应该坐第一排的第一个,它的座标是(1,1)。而8号同学在第四排的第二个,它的座标是(4,2)。
现在的问题是,我们怎么样才能知道任意一个同学到底坐在哪个座位上(即这个座位的座标)呢?
我想,这个问题可难不倒你,你能编写一个程序帮助成功小学的同学解决这个问题吗?
 

输入

输入一个整数N(1<=N<=32767),表示第N个同学。

输出

输出两个整数i,j,中间用一个空格隔开,表示第N个同学的座位在第i行的第j个位置。

样例输入 Copy

5

样例输出 Copy

3 2
这题和新生19场的数字三角形很像啊,但我不明白为什么有的时候数据就是输不出来,程序直接停掉,很奇怪啊,这个我也就是在那个代码的基础上修改了一下
#include<iostream>
using namespace std;
int a[5050][5050];
int main(){
    int k=1;
    a[1][1]=1;
    for(int i=2;i<=5000;i++)
    {
        a[i][1]=a[i-1][1]+k;
        for(int j=2;j<=i;j++)
        {
            a[i][j]=a[i][j-1]+1;
        }
        k++;
    }
   int n;
   cin>>n;
   for(int i=1;i<=5000;i++)
   {
       for(int j=1;j<=i;j++)
       {
           if(a[i][j]==n)
               cout<<i<<" "<<j<<endl;
       }
   } 
   return 0;
}

 铺地砖:

题目描述

一天,晨晨的数学老师布置了一道题目,大意如下:用1×1和2×2的磁砖不重叠地铺满n×3的地板,共有多少种方案?
例如:n=1时:1×3的地板方法就一个,直接由三个1×1的磁砖铺满。
      n=2时:2×3的地板可以由下面3种方案铺满:
新生22场

输入

第一行:一个整数n(1≤n≤100)。

输出

输出铺满n×3的地板的方案数。

样例输入 Copy

3

样例输出 Copy

5

提示

对于20%的数据,1≤n≤15;
对于50%的数据,1≤n≤30;
对于100%的数据,1≤n≤100; 这题是个显然的递推,用到加法和乘法原理: 把这个地板看成是有3列,第一列只有一种铺法,即3个1*1的,第二列有三种,即一种是两三个1*1和一个2*2,这样左右有两种和6个1*1,一共两种 第三列看成第一列加第二列铺出来的 第四列看成第二列和第三列铺出来的 第五列... 所以递推式就是f[n]=f[n-1]+f[n-2]*2(一列只有一种,两列会有两种) 这题的数据规模很大哦,到100,而这种递推式是呈指数型爆炸式的增长,自然用到高精度,用一个二维数组(有借鉴洛谷)
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,f[5010][5010],len;
void min(int k)
{
    for(int i=1; i<=len; i++)
        f[k][i]=f[k-1][i]+f[k-2][i]*2;
    for(int i=1; i<=len; i++)
        if(f[k][i]>=10)
        {
            f[k][i+1]+=f[k][i]/10;
            f[k][i]%=10;
            if(f[k][len+1]>0)len++;
        }
}
int main()
{
    cin>>n;
    len=1;
    f[1][1]=1;
    f[2][1]=3;
    for(int i=3; i<=n; i++)
        min(i);
    for(int i=len; i>=1; i--)
        cout<<f[n][i]<<endl;
    return 0;
}

阅读训练:

一天晨晨在做阅读训练。她拿了一本包括n篇文章的小说集,第i篇文章包括bi (1≤bi≤100)页,已知晨晨每读一页都要花一分钟。假设晨晨开始阅读小说第一页的时间起点为0,她读第一篇文章从时间点0到时间点b1-1,第二篇文章从时间点b1到时间点b1+b2-1,依此类推…,阅读第n篇文章的时间点b1+b2+…+bn-1到时间点b1+b2+…+bn-1+bn-1。那么,当在时间点t时(0≤t<阅读总时间),你知道晨晨在阅读第几篇文章吗?
其实晨晨的好奇心比你还强,虽然阅读还未正式开始,但她很想知道在未来Q个时间点时,自己分别会在阅读哪一篇文章?
严重偏文科的晨晨,感觉这个问题很棘手,就想请你这个电脑高手帮忙。
例如:如果一本书包括三篇文章:第一篇文章2页,第二篇文章1页,第三篇文章3页,那么时间点与所读文章(序号)的关系如下图所示:
新生22场

输入

第一行:包括空格分开的两个整数N和Q (其中1≤n≤100,1≤Q≤1000) 。
接下来的N行,每行一个整数代表每篇文章的页数。
再接下来是Q行,每行一个整数代表一个时间点。

输出

总共Q行,每行一个数,代表按输入顺序的每个时间点正在阅读的文章序号。
 

样例输入 Copy

3 5
2
1
3
2
3
4
0
1

样例输出 Copy

2
3
3
1
1
这题真的挺考验的循环的??最简单的思路就是开个b数组初始化,然后直接需要什么找什么就好了,初始化的过程需要注意以下
#include<iostream>
using namespace std;
const int N=10010;
int a[N],b[N];
int main(){
    int n,m,t;
    cin>>n>>m;
    for(int i=0;i<n;i++)
        cin>>a[i];
    int z=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<a[i];j++)
        {
            b[z++]=i+1;
        }
    }
    for(int i=0;i<m;i++)
    {
        cin>>t;
        cout<<b[t]<<endl;
    }
    return 0;
}

 

上一篇:无法打开包括文件 “gl/glut.h” No such file or directory的解决方法


下一篇:2022-01-22 京剧《秦香莲》介绍