数字三角
中山市迎接2010年亚运会活动将要在兴中体育场举行,市教育局为每个学校安排了一个区域,每个学校的同学都要坐在自己学校的区域内。分给成功小学的区域是个等边三角型,这不是不重视成功小学,而是把难题给了成功小学,就是因为成功小学的同学更加优秀,因此这点小问题是难不倒他们的。大家根据座位区域,一下就设计出了以下座位安排方案:
……
我们可以看出,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种方案铺满:
输入
第一行:一个整数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页,那么时间点与所读文章(序号)的关系如下图所示:
输入
第一行:包括空格分开的两个整数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; }