这题本来属于高精度,但是并没有用到高精度。而是用到了递归,所以我放在这一类了
1333: 深入浅出学算法028-双色Hanoi塔问题
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int f(int n,char a,char b,char c)
{
if(n==1) cout<<n<<" "<<a<<" "<<c<<endl;
else
{
f(n-1,a,c,b);
cout<<n<<" "<<a<<" "<<c<<endl;
f(n-1,b,a,c);
}
}
int main()
{
ll k;
cin>>k;
f(k,'A','C','B');
return 0;
}
1334: 深入浅出学算法029-走楼梯
题目描述
楼梯有N级台阶,上楼可以一步上一阶,也可以一步上二阶。编一递归程序,计算共有多少种不同走法?
输入
输入N (1 <= n <=36)
输出
输出多少种走法
样例输入 Copy
3
样例输出 Copy
3
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll n,i,a[100];
cin>>n;
a[1]=1;
a[2]=2;
for(i=3;i<=n;i++){
a[i]=a[i-1]+a[i-2];
}
cout<<a[n]<<endl;
return 0;
}
1335: 深入浅出学算法030-兔子繁殖
题目描述
有一种兔子,出生后一个月就可以长大,然后再过一个月一对长大的兔子就可以生育一对小兔子且以后每个月都能生育一对。现在,我们有一对刚出生的这种兔子,那么,n个月过后,我们会有多少对兔子呢?假设所有的兔子都不会死亡。
输入
输入文件仅一行,包含一个自然数n (1 <= n <= 50)。
输出
输出文件仅一行,包含一个自然数,即n个月后兔子的对数。
样例输入 Copy
5
样例输出 Copy
5
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll n,i,a[100];
cin>>n;
a[1]=1;
a[2]=1;
for(i=3;i<=n;i++){
a[i]=a[i-1]+a[i-2];
}
cout<<a[n]<<endl;
return 0;
}
1336: 深入浅出学算法031-平面分割
题目描述
同一平面内有n(n≤500)条直线,已知其中p(p≥2)条直线相交于同一点,则这n条直线最多能将平面分割成多少个不同的区域?
输入
两个整数n(n≤500)和p(如果n>=2则2≤p≤n)。
输出
一个正整数,代表最多分割成的区域数目。
样例输入 Copy
12 5
样例输出 Copy
73
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll n,i,p,s=0;
cin>>n>>p;
s=2*p;
for(i=p+1;i<=n;i++) s+=i;
cout<<s<<endl;
return 0;
}
1337: 深入浅出学算法032-骨牌铺法
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll n,i,a[999];
cin>>n;
a[1]=1;
a[2]=2;
a[3]=4;
for(i=4;i<=n;i++) a[i]=a[i-1]+a[i-2]+a[i-3];
cout<<a[n];
return 0;
}
1338: 深入浅出学算法033-蜜蜂路线
因为这道题的数字太大,所以要用高精度来算。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,i,j,a[10000],c[10000],b[10000],k=0;
int main(){
cin>>m>>n;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
n=n-m+1,m=1;//可以转化为从1到n-m+1的路程
a[0]=1;
b[0]=1;
for(i=3;i<=n;i++){
for(j=0;j<=9999;j++){//把a数组看为fn-2,b数组看为fn-1,c数组看为Fn
c[j]=a[j]+b[j]+k;
k=0;
if(c[j]>=10){
k=c[j]/10;
c[j+1]+=c[j]/10;
c[j]%=10;
}
}
for(j=9999;j>=0;j--){
a[j]=b[j];//将函数是向前递进
b[j]=c[j];
}
}
for(i=9999;i>=0;i--) if(c[i]) break;//删除多余前导零
if(n>=3) for(j=i;j>=0;j--){
cout<<c[j];
}
if(n<3) cout<<"1";
return 0;
}
1339: 深入浅出学算法034-数塔问题
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll i,j,n,a[15][15];
cin>>n;
for(i=1; i<=n; i++)
{
for(j=1; j<=i; j++)
{
cin>>a[i][j];
}
}
for(i=n-1;i>=1;i--){
for(j=1;j<=i;j++){
if(a[i+1][j]>a[i+1][j+1]) a[i][j]+=a[i+1][j];
else a[i][j]+=a[i+1][j+1];
}
}
cout<<a[1][1];
return 0;
}
1340: 深入浅出学算法035-过河卒
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll x1,y1,x2,y2,a[25][25],h[500][500],i,j;
cin>>x1>>y1>>x2>>y2;
memset(h,0,sizeof(h));
memset(a,0,sizeof(a));
x1++,x2++,y1++,y2++;
h[x2][y2]=1;
if(x2-2>=0)
{
if(y2-1>=0) h[x2-2][y2-1]=1;
h[x2-2][y2+1]=1;
}
if(x2-1>=0)
{
if(y2-2>=0) h[x2-1][y2-2]=1;
h[x2-1][y2+2]=1;
}
if(y2-2>=0) h[x2+1][y2-2]=1;
if(y2-1>=0) h[x2+2][y2-1]=1;
h[x2+1][y2+2]=1,h[x2+2][y2+1]=1;
a[1][1]=1;
for(i=1; i<=x1; i++)
{
for(j=1; j<=y1; j++)
{
if(a[i][j]==0&&h[i][j]==0) a[i][j]+=a[i-1][j]+a[i][j-1];
}
}
cout<<a[x1][y1]<<endl;
return 0;
}
1341: 深入浅出学算法036-极值问题
题目描述
已知m、n为整数,且满足下列两个条件:
① m、n∈{1,2,…,k},即1≤m,n≤k
②(n2-m*n-m2)2=1
你的任务是:编程输入正整数k(1≤k≤109),求一组满足上述两个条件的m、n,并且使m2+n2的值最大。例如,从键盘输入k=1995,则输出:m=987 n=1597。
输入
输入k
输出
按样例输出m和n
样例输入 Copy
1995
样例输出 Copy
m=987
n=1597
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll k,a[50],i;
cin>>k;
memset(a,0,sizeof(a));
a[1]=1;
a[2]=1;
for(i=2;i<=45;i++){
a[i]=a[i-1]+a[i-2];
if(k<=a[i]){
cout<<"m="<<a[i-2]<<endl;
cout<<"n="<<a[i-1]<<endl;
break;
}
}
return 0;
}
1342: 深入浅出学算法037-火车站
题目描述
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问x站开出时车上的人数是多少?
输入
a(≤20),n(≤20),m(≤2000),和x(≤20),
输出
从x站开出时车上的人数。无解则输出No answer.
样例输入 Copy
5 7 32 4
样例输出 Copy
13
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll i,a,n,m,x,f[9999],c[4],b,k;
cin>>a>>n>>m>>x;
memset(f,0,sizeof(f));
f[1]=a;
f[2]=a;
b=0;
while(b<=999)
{
c[3]=a+b,c[1]=a,c[2]=b;
k=c[2];
for(i=3; i<=n; i++)
{
f[i]=f[i-1]+c[3]-k;
c[1]=c[2],c[2]=c[3],c[3]=c[1]+c[2];
k=c[2];
}
if(f[n-1]==m){
cout<<f[x];
break;
}
else b++;
}
if(b==1000) cout<<"No answer.";
return 0;
}
1343: 深入浅出学算法038-昆虫繁殖
题目描述
科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵),问过Z个月以后,共有成虫多少对?0=<X<=20,1<=Y<=20,X=<Z<=50
输入
x,y,z的数值
输出
过Z个月以后,共有成虫对数
样例输入 Copy
1 2 8
样例输出 Copy
37
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll x,y,z,i,j,a[2020],b[2020];
cin>>x>>y>>z;
memset(a,0,sizeof(a));
for(i=1;i<=x;i++) a[i]=1,b[i]=0;
for(i=x+1;i<=z+1;i++){
b[i]=a[i-x]*y;
a[i]=a[i-1]+b[i-2];
}
cout<<a[z+1];
return 0;
}
1344: 深入浅出学算法039-位数问题
题目描述
在所有的N位数中,有多少个数中有偶数个数字3?由于结果可能很大,你只需要输出这个答案对12345取余的值。
输入
读入一个数N
输出
输出有多少个数中有偶数个数字3。
样例输入 Copy
2
样例输出 Copy
73
提示
1<=N<=1000
在所有的2位数字,包含0个3的数有72个,包含2个3的数有1个,共73个
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll n,i,j,a[2020],b[2020];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
cin>>n;
a[1]=9;
b[1]=1;
for(i=2;i<=n;i++){
j=a[1];
if(i==n) j--;
a[i]=(a[i-1]*j+b[i-1])%12345;
b[i]=(a[i-1]+b[i-1]*j)%12345;
}
cout<<a[n];
return 0;
}
1345: 深入浅出学算法040-邮票问题
题目描述
设有已知面额的邮票m种,每种有n张,用总数不超过n张的邮票,能从面额1开始,最多连续组成多少面额。(1≤m≤100,1≤n≤100,1≤邮票面额≤255)
输入
第一行:m,n的值,中间用一空格隔开。
第二行:A[1…m](面额),每个数中间用一空格隔开。
输出
连续面额数的最大值
样例输入 Copy
3 4
1 2 4
样例输出 Copy
14
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll m,n,a[30000],b[300],flag=0;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>b[i];
if(b[i]==1) flag=1;
}
if(flag==0) cout<<0<<endl;
else{
int i=1;
a[i]=1;
while(a[i]<=m&&a[i]!=0){
i++;
for(int j=1;j<=n;j++){
if(((i%b[j]==0)&&(i/b[j]<a[i]))||(a[i]==0)){
a[i]=i/b[j];
}
}
for(int j=1;j<=i/2;j++){
if(a[j]+a[i-j]<a[i]) a[i]=a[j]+a[i-j];
}
}
cout<<i-1;
}
return 0;
}
1346: 深入浅出学算法041-数的计数
题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n≤1000), 然后对此自然数按照如下方法进行处理:
1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不能超过原数(输入的n)的一半;
3.加上数后,继续按此规则进行处理,直到不能再加自然数为止。
输入
输入一个自然数n(n≤1000)
输出
输出满足条件的数的个数
样例输入 Copy
6
样例输出 Copy
6
提示
满足条件的数为 6 (此部分不必输出)
16
26
126
36
136
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll n,max,a[2020],i,j;
cin>>n;
memset(a,0,sizeof(a));
a[1]=a[0]=1;
for(i=2;i<=n;i++){
a[i]=a[i/2]+a[i-2];
}
cout<<a[n];
return 0;
}