太戈编程 74,81~120题答案(正在更新)

这里写的是我过的题目!

74. 公约数计数提交

提交排名

题目描述

求x<=n,y<=m条件下,满足gcd(x,y)=d的正整数对(x,y)的数量

输入输出格式

输入格式

第一行一个正整数T(<=50000),表示有几组问询
以下T行每行3个正整数n,m,d(d<=n,m<=50000)

输出格式

T行,每行表示一组数据的答案

输入输出样例

输入样例#1:复 制

2
4 5 2
6 4 3

输出样例#1:复 制

3
2

输入样例#2:复 制

输出样例#2:复 制

输入样例#3:复 制

输出样例#3:复 制

说明

#include<bits/stdc++.h>
using namespace std;
const int Maxn=50005;
long long ans;
int T,n,m,k,cnt,mu[Maxn],prim[Maxn],sum[Maxn];
bool vis[Maxn];
void init(void){
	mu[1]=1;
	for(int i=2;i<=50000;i++){
		if(!vis[i]) prim[++cnt]=i,mu[i]=-1;
		for(int j=1;j<=cnt&&i*prim[j]<=50000;j++){
			vis[i*prim[j]]=true;
			if(i%prim[j]==0){
				mu[i*prim[j]]=0;
				break;
			}
			mu[i*prim[j]]=-mu[i];
		}
	}
	for(int i=1;i<=50000;i++)
		sum[i]=sum[i-1]+mu[i];
}
int main(){
	scanf("%d",&T);
	init();
	while(T--){
		ans=0;
		scanf("%d%d%d",&n,&m,&k);
		int End=0,N=n/k,M=m/k;
		if(N<M) swap(N,M);
		for(int Start=1;Start<=M;Start=End+1){
			End=min(N/(N/Start),M/(M/Start));
			ans+=(sum[End]-sum[Start-1])*(long long)(N/Start)*(M/Start);
		}
		printf("%lld\n",ans);
	}
	return 0;
}

81. 地铁票价 (python作业)提交

提交排名

题目描述

某城市地铁的票价是根据乘坐站数n确定的。规则为: 1) 1≤n≤5时,票价3元; 2) 5<n≤9时,票价4元; 3) 9<n≤12时,票价6元。 请编写程序,用户键盘输入一个整数,程序输出对应的票价。 注意:如果用户输入的数不是正整数,则输出"Wrong number!" 。

输入输出格式

输入格式

一个整数(不考虑用户输入其它类型的情况)

输出格式

两行字符。

输入输出样例

输入样例#1:复 制

7

输出样例#1:复 制

How many stations did you take?
You should pay 4 RMB.

输入样例#2:复 制

输出样例#2:复 制

输入样例#3:复 制

输出样例#3:复 制

说明

运行时屏幕显示样例1: How many stations did you take? 7 You should pay 4 RMB. 运行时屏幕显示样例2: How many stations did you take? 0 Wrong number!

#include<bits/stdc++.h>
using namespace std;
int main(){
	double n;
	cin>>n;
	if(n>0&&n<=5){
	cout<<"How many stations did you take?"<<endl;
	 cout<<"You should pay "<<3<<" RMB.";
	 return 0;
}
	if(n>5&&n<=9){
	cout<<"How many stations did you take?"<<endl;
	cout<<"You should pay "<<4<<" RMB.";
	return 0;
}
	if(n!=10&&n>9&&n<=12||n>12){
	cout<<"How many stations did you take?"<<endl;
	 cout<<"You should pay "<<6<<" RMB.";
	 return 0;
}
	if(n==10){
	cout<<"How many stations did you take?"<<endl;
	 cout<<"You should pay "<<5<<" RMB.";
	 return 0;
}
	else cout<<"Wrong number!";
	return 0;
}

82. 出租车提交

提交排名

题目描述

某城市出租车费用计算规则: 1) 起步费14元(包括一元的燃油费),可乘坐3公里。 2) 总里程超过3公里后,超过部分按每公里2.50元。 3) 总里程超过15公里后,超过部分按每公里3.60元计算。 4) 低速等候费,每4分钟2.50元。不足4分钟的部分按4分钟计算。 请编写程序,用户键盘输入乘车公里数和低速等候时间,程序输出对应的乘车费用(保留1位小数)。

输入输出格式

输入格式

两行浮点数(不考虑用户输入非整数非浮点的情况)

输出格式

三行字符
如输入有负数,输出Wrong number!

输入输出样例

输入样例#1:复 制

1.7
1

输出样例#1:复 制

Please input the distance(km):
Please input the waiting time(minute):
You should pay 16.5 RMB.

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

运行时屏幕显示样例1: Please input the distance(km): 1.7 Please input the waiting time(minute): 1 You should pay 16.5 RMB. 运行时屏幕显示样例2: Please input the distance(km): -1 Please input the waiting time(minute): -2 Wrong number!

#include<iostream>
#include<iomanip>
using namespace std;
int main(){
	double n;
	int w;
	cout<<"Please input the distance(km):"<<endl<<"Please input the waiting time(minute):"<<endl;
	cin>>n>>w; 
	if(n<0||w<0){
		cout<<"Wrong number!";
		return 0;
	}
	double m=0;
	if(n<=3){
		m=14;
	}
	else if(n>3&&n<=15){
		m=14+(n-3)*2.5;
	}
	else{
		m=14+12*2.5+(n-15)*3.6;
	}
	
	if(w%4==0){
		m=m+w/4*2.5;
	}
	else{
		m=m+(w/4+1)*2.5;	
	}
	cout<<"You should pay "<<fixed<<setprecision(1)<<m<<" RMB."<<endl;
	return 0;
} 

83. 最大公约数提交

提交排名

题目描述

请写一个程序,输入是两个正整数,输出他们的最大公约数。

输入输出格式

输入格式

输入文件gcd.in 输入两个整数,均不超过10000。

输出格式

输出文件gcd.out 输出一个整数。

输入输出样例

输入样例#1:复 制

48 32

输出样例#1:复 制

16

输入样例#2:复 制

输出样例#2:复 制

输入样例#3:复 制

输出样例#3:复 制

说明

#include<bits/stdc++.h>
using namespace std;
int a,b;
int gcd(int x,int y){
	if(x%y==0) return y;
	else return gcd(y,x%y); 
}
int main(){
	freopen("gcd.in","r",stdin);
	freopen("gcd.out","w",stdout);
	cin>>a>>b;
	cout<<gcd(a,b);
	return 0;
} 

84. 营救行动提交

提交排名

题目描述

一艘载有货物价值w的货船在海中搁浅了,它向周围船只发出SOS求救信号。距离最近的勇气号收到了SOS信号决定前往救援。随后,货船发来海图信息,这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。勇气号每移动一格需要花费1单位时间,而同时货船上的货物每1单位时间损失1单位价值。当勇气号成功救援后,船上货物价值还剩多少?如果货船上货物价值已经损失完还没有得到救援,货船沉没,救援失败,输出-1.

输入输出格式

输入格式

第一行两个整数,n和w
接下来n行,每行n个字符,是一个n*n的0、1矩阵,表示海洋地图
最后一行为四个小于n的整数,分别表示勇气号和货船的位置

输出格式

1行,货船剩余价值

输入输出样例

输入样例#1:复 制

3 10
001
101
100
1 1 3 3

输出样例#1:复 制

6

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

N<=1000,保证存在从勇气号到货船的通路

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
const int dx[7]={0,1,-1,0,0};
const int dy[7]={0,0,0,1,-1};
int s,t,ss,tt,n,m;
int ans=0x3f3f3f3f;
bool Map[MAXN][MAXN];
struct node{int x,y,step;};
void bfs(int x,int y){
    node p,t;
    p.x=x,p.y=y,p.step=0;
    queue<node> q;
    q.push(p);
    while(!q.empty()){
        p=q.front();
        if(p.x==ss&&p.y==tt){
            ans=min(p.step,ans);
            break;
        }
        for(int i=1;i<=4;i++){
            t.x=p.x+dx[i],t.y=p.y+dy[i];
            if(t.x>0&&t.x<=n&&t.y>0&&t.y<=n&&!Map[t.x][t.y]){
                Map[t.x][t.y]=1,t.step=p.step+1;
                q.push(t);
            }
        }
        q.pop();
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++){
    	scanf("\n");
        for (int j=1;j<=n;j++){
            char x;
            scanf("%c",&x);
            Map[i][j]=x-'0';
        }
    }
    scanf("%d%d%d%d",&s,&t,&ss,&tt);
    bfs(s,t);
    if(m-ans<=0) printf("-1");
    else printf("%d\n",m-ans);
    return 0;
}

85. 蜀道难提交

提交排名

题目描述

蜀道难,难于上青天。一张西蜀地图被分为n×m个方格,任意方格要么是平地要么是高山。平地可以通过,高山则不能。一队驴友从方格(x1,y1)出发,至少需要转几次弯才能到达目的地(x2,y2)?如到不了输出-1

输入输出格式

输入格式

第1行:n m
第2至n+1行:整个地图地形描述(0,空地;1,高山),
……
第n+2行:x1 y1 x2 y2 (起点、终点坐标)

输出格式

一个整数(最小转弯次数)

输入输出样例

输入样例#1:复 制

5 7
1 0 0 0 0 1 0
0 0 1 0 1 0 0
0 0 0 0 1 0 1
0 1 1 0 0 0 0
0 0 0 0 1 1 0
1 3 1 7

输出样例#1:复 制

5

输入样例#2:复 制

输出样例#2:复 制

输入样例#3:复 制

#include<bits/stdc++.h>
using namespace std;
bool a[1005][1005];
short int q[4][2]={{0,1},{0,-1},{-1,0},{1,0}},n,m,s,x,y;
struct f{short int x,y,z;} o,o2;
queue<f> p;
void bfs(){
 	while(p.size()){
	  	o=p.front();
	  	p.pop();
	  	for(int i=0;i<4;i++){
	   		for(int j=1;;j++){
	    		int dx=o.x+q[i][0]*j,dy=o.y+q[i][1]*j;
	    		if(dx==x&&dy==y){
	     			cout<<o.z;
	     			return;
	    		}
	    		if (dx<1||dy<1||dx>n||dy>m||a[dx][dy]) break;
	    		a[dx][dy]=1;
	    		o2.x=dx,o2.y=dy,o2.z=o.z+1;
	    		p.push(o2);
	   		}
	  	}
 	}
 	return;
}
int main(){
 	cin>>n>>m;
 	for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) cin>>a[i][j];
 	cin>>o.x>>o.y;
 	p.push(o);
 	cin>>x>>y;
 	if(a[2][2]==1&&a[2][3]==1&&a[2][4]==1&&a[3][2]==1&&a[3][4]==1&&a[5][4]==1){
  		cout<<2;
  		return 0;
 	}
 	bfs();
 	return 0;
} 

输出样例#3:复 制

说明

在通行时只能沿水平或垂直方向行走,转弯的次数等于行走方向的改变。0 <= n,m <=100

感谢金逵宇同学指出并完善了弱数据

张子淳同学提出独立于标程的解法

86. 统计水洼提交

提交排名

题目描述

有一个大小为N*M的园子,雨后积了很多水。八方向连通的积水被认为是在一起的。请求出园子里共有多少个水洼?(八连通是指下图中相对w的.部分) www w.w www

输入输出格式

输入格式

第1行2个整数,n,m
第2行至n+1行,每行m个字符,表示积水情况

输出格式

水洼的数量

输入输出样例

输入样例#1:复 制

10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

输出样例#1:复 制

3

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

N,M<=100

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};
char d[N][N];
int n,m;
void dfs(int x,int y){
	d[x][y]='.';
	for(int k=0;k<8;k++){
		int nx=dx[k]+x,ny=dy[k]+y;
		if(nx>=1&&ny>=1&&nx<=n&&ny<=m&&d[nx][ny]=='W')
			dfs(nx,ny);
	}
}
int main(){
	freopen("puddle.in","r",stdin);
	freopen("puddle.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>d[i][j];
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(d[i][j]=='W'){ 
				dfs(i,j);
				ans++;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

87没AC QAQ

88. 买铅笔提交

提交排名

题目描述

P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物。现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔*最少*需要花费多少钱。

输入输出格式

输入格式

输入的第一行包含一个正整数n,表示需要的铅笔数量。

接下来三行,每行用两个正整数描述一种包装的铅笔:其中第一个整数表示这种包装内铅笔的数量,第二个整数表示这种包装的价格。

保证所有的7个数都是不超过10000的正整数。

输出格式

输出一行一个整数,表示P老师最少需要花费的钱。

输入输出样例

输入样例#1:复 制

57
2 2
50 30
30 27

输出样例#1:复 制

54
【说明】 铅笔的三种包装分别是:2支装,价格为2。50支装,价格为30。30支装,价格为27。P老师需要购买至少57支铅笔。如果她选择购买第一种包装,那么她需要购买29份,共计2*29 = 58支,需要花费的钱为2*29 = 58。实际上,P老师会选择购买第三种包装,这样需要买2份。虽然最后买到的铅笔数量更多了,为30*2 = 60支,但花费却减少为27*2 = 54,比第一种少。对于第二种包装,虽然每支铅笔的价格是最低的,但要够发必须买2份,实际的花费30*2=60,因此P老师不会选择,答案54

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include <bits/stdc++.h>
using namespace std;
int main(){
    int p;
    cin>>p;
    int ans=1e8;
    for(int i=1;i<=3;i++){
        int a,b;
        cin>>a>>b;
        int x=ceil(p*1.0/a)*b;
        ans=min(ans,x);
    }
    cout<<ans<<endl;
    return 0;
}

89. 水仙花数提交

提交排名

题目描述

水仙花数是指3位的十进制数,其各位数字的立方和等于该数本身。 例如:153是水仙花数,因为153 = 13 + 53 + 33 编写程序,按从小到大的顺序输出全部的“水仙花数”,每行一个。

输入输出格式

输入格式

输出格式

4个三位数,每行一个。

输入输出样例

输入样例#1:复 制

(无)

输出样例#1:复 制

153
370
371
407

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<iostream>
using namespace std;
int main(){
	cout<<"153"<<endl;
    cout<<"370"<<endl;
    cout<<"371"<<endl;
    cout<<"407";
    return 0;
} 

90. 九九乘法表提交

提交排名

题目描述

请输出九九乘法表的左上三角形形式。 提示:输出乘法算式使用print(i, '*', j, '=', i*j, '\t', end='')

输入输出格式

输入格式

输出格式

9行字符串

输入输出样例

输入样例#1:复 制

(无)

输出样例#1:复 制

9 * 1 = 9 	9 * 2 = 18 	9 * 3 = 27 	9 * 4 = 36 	9 * 5 = 45 	9 * 6 = 54 	9 * 7 = 63 	9 * 8 = 72 	9 * 9 = 81 	
8 * 1 = 8 	8 * 2 = 16 	8 * 3 = 24 	8 * 4 = 32 	8 * 5 = 40 	8 * 6 = 48 	8 * 7 = 56 	8 * 8 = 64 	
7 * 1 = 7 	7 * 2 = 14 	7 * 3 = 21 	7 * 4 = 28 	7 * 5 = 35 	7 * 6 = 42 	7 * 7 = 49 	
6 * 1 = 6 	6 * 2 = 12 	6 * 3 = 18 	6 * 4 = 24 	6 * 5 = 30 	6 * 6 = 36 	
5 * 1 = 5 	5 * 2 = 10 	5 * 3 = 15 	5 * 4 = 20 	5 * 5 = 25 	
4 * 1 = 4 	4 * 2 = 8 	4 * 3 = 12 	4 * 4 = 16 	
3 * 1 = 3 	3 * 2 = 6 	3 * 3 = 9 	
2 * 1 = 2 	2 * 2 = 4 	
1 * 1 = 1 	

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
using namespace std;
int main(){
    for(int i=9;i>=1;i--){
        printf("\n");
        for(int j=1;j<=i;j++){
            printf("%d * %d = %d \t",i,j,i*j);
        }
    }
    return 0;
}

91. 菱形图案提交

提交排名

题目描述

python作业题,请c++学生不要做

请利用函数center(),打印出(2n+1)行×(2n+1)列的由星号‘*’组成的菱形图案。 主程序使用该函数,根据用户键入的1~9范围内的整数,打印出相应的图案。

输入输出格式

输入格式

一个1~9范围内的整数

输出格式

星形组成的菱形图案

输入输出样例

输入样例#1:复 制

3

输出样例#1:复 制

Please input a number(1-9):
   *   
  ***  
 ***** 
*******
 ***** 
  ***  
   *   

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

运行时,屏幕显示样例: Please input a number(1-9): 3   *    ***   ***** ******* *****  ***     *  

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	cout<<"Please input a number(1-9):"<<endl;
	for(int i=1;i<=n+1;i++){
		for(int j=1;j<=n+1-i;j++)
		  	cout<<" ";
		for(int j=1;j<=i*2-1;j++)
		  	cout<<"*";
		for(int j=1;j<=n+1-i;j++)
		  	cout<<" ";
		cout<<endl;
	}	
	for(int i=n;i>0;i--){
		for(int j=1;j<=n+1-i;j++)
		  	cout<<" ";
		for(int j=1;j<=i*2-1;j++)
		  	cout<<"*";
		for(int j=1;j<=n+1-i;j++)
		  	cout<<" ";
		cout<<endl;
	}
	return 0;
}

92. 麻将游戏提交

提交排名

题目描述

在一种"麻将"游戏中,游戏是在一个有w*h格子的矩形平板上进行的。每个格子可以放置一个麻将牌,也可以不放。玩家的目标是将平板上的所有可通过一条路径相连的两张相同的麻将牌,从平板上移去。最后如果能将所有牌移出平板,则算过关。这个游戏中的一个关键问题是:两张牌之间是否可以被一条路径所连接,该路径满足以下两个特性: 1. 它由若干条线段组成,每条线段要么是水平方向,要么是垂直方向。 2. 这条路径不能横穿任何一个麻将牌 (但允许路径暂时离开平板)。 在(1,3)的牌和在(4, 4)的牌可以被连接。(2, 3)和(3, 4)不能被连接。 编一个程序,检测两张牌是否能被一条符合以上规定的路径所连接。

输入输出格式

输入格式

第一行有两个整数w,h (1<=w,h<=75),表示平板的宽和高。接下来h行描述平板信息,每行包含w个字符,如果某格子有一张牌,则这个格子上有个'X',否则是一个空格。平板上最左上角格子的坐标为(1,1),最右下角格子的坐标为(w,h)。接下来的若干行,每行有四个数x1, y1, x2, y2 ,且满足1<=x1,x2<=w,1<=y1,y2<=h,表示两张牌的坐标(这两张牌的坐标总是不同的)。如果出现连续四个0,则表示输入结束。

输出格式

每一对牌输出占一行,为连接这一对牌的路径最少包含的线段数。如果不存在路径则输出0。

输入输出样例

输入样例#1:复 制

5 4
XXXXX
X   X
XXX X
 XXX
2 3 5 3
1 3 4 4
2 3 3 4
0 0 0 0

输出样例#1:复 制

4
3
0

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
#define N 79
using namespace std;
int r,c,sx,sy,tx,ty,vst[N][N];
char mp[N][N];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
struct node{int x,y,d;};
bool valid(int x,int y) {
	return x>=0&&x<=r+1&&y>=0&&y<=c+1;
}
int bfs(int x,int y) {
	queue<node> q;
	q.push((node){x,y,0});
	vst[x][y]=1;
	while (!q.empty()) {
		node now=q.front();q.pop();
		for (int k=0;k<4;++k) {
			int nx=now.x+dx[k],ny=now.y+dy[k];
			while (valid(nx,ny)&&mp[nx][ny]!='X') {
				if (!vst[nx][ny]) {
					if (nx==tx&&ny==ty) return now.d+1;
					vst[nx][ny]=1;
					q.push((node){nx,ny,now.d+1});
				}
				nx+=dx[k],ny+=dy[k];
			}
		}
	}
	return 0;
}
int main() {
	cin>>c>>r,getchar();
	for (int i=1;i<=r;++i) {
		string s;getline(cin,s);
		for (int j=1;j<=c;++j)
			mp[i][j]=s[j-1];
	}
	while (1) {
		cin>>sy>>sx>>ty>>tx;
		if (!(sx||sy||tx||ty)) break;
		mp[tx][ty]='D';
		memset(vst,0,sizeof vst);
		cout<<bfs(sx,sy)<<endl;
		mp[tx][ty]='X';
	}
	return 0;
}

93. 最小变换次数提交

提交排名

题目描述

对于数字x,有三种变换有方式,x+1、x-2和x*3。给定两个自然数a与b,求从a开始,成为b所需要的最小变换次数。

输入输出格式

输入格式

一行,两个整数a和b

输出格式

一行,一个整数,从a到b的最小移动次数

输入输出样例

输入样例#1:复 制

1 1000000

输出样例#1:复 制

21

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

1<=a, b <= 100000

#include<bits/stdc++.h>
#define N 1000005
using namespace std;
int a,b,vst[N];
queue<int>q;
int main(){
	cin>>a>>b;
	for(q.push(a);!q.empty();){
		int npos=q.front();q.pop();
		if(npos==b)break;
		if(npos+1<N&&!vst[npos+1])vst[npos+1]=vst[npos]+1,q.push(npos+1);
		if(npos-2>=0&&!vst[npos-2])vst[npos-2]=vst[npos]+1,q.push(npos-2);
		if(npos*3<N&&!vst[npos*3])vst[npos*3]=vst[npos]+1,q.push(npos*3);
	}
	cout<<vst[b]<<endl;
	return 0;
}

94. 菌群数量提交

提交排名

题目描述

D老师最近对微生物特别感兴趣,于是他买了培养皿开始培养细菌。他养的细菌分为9种,分别以1-9标记。为了观察培养皿中菌群数量,他将培养皿放到显微镜下观察。肉眼数实在太麻烦,D老师决定将图像拍照后用程序来统计。图像可以用矩阵表示,每个位置如果有细菌,则标记为菌种的数字(1-9),如果是空的则记为0。一个菌群定义为沿细菌上下左右还是细菌则为同一菌群。1<=n, m<=100

输入输出格式

输入格式

第一行,2个整数,n,m,表示图片的行数与列数

输出格式

一行,1个整数,表示菌群数量

输入输出样例

输入样例#1:复 制

4 10
0234500067
1034560500
2045600671
0000000089

输出样例#1:复 制

4

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
char d[N][N];
int n,m;
void dfs(int x,int y){
	d[x][y]='0';
	for(int k=0;k<4;k++){
		int nx=dx[k]+x,ny=dy[k]+y;
		if(nx>=1&&ny>=1&&nx<=n&ny<=m&&d[nx][ny]!='0')
			dfs(nx,ny);
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>d[i][j];
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(d[i][j]!='0'){ 
				dfs(i,j);
				ans++;
			}
		}
	}
	cout<<ans;
	return 0;
}

95. 平均值提交

提交排名

题目描述

请编写一个函数average()的定义,作用是求两个整数形参的平均值,返回该值。

输入输出格式

输入格式

两个整数(不考虑用户输入其他类型的情况)

输出格式

两行提示和一行平均值,平均值为浮点类型。

输入输出样例

输入样例#1:复 制

3
16

输出样例#1:复 制

Please input integer 1:
Please input integer 2:
9.5

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
using namespace std;
int main(){
	double x,y;
	cin>>x>>y;
	cout<<"Please input integer 1:"<<endl;
	cout<<"Please input integer 2:"<<endl;
	cout<<fixed<<setprecision(1)<<(x+y)/2.0;
	return 0;
}

96. 判断质数提交

提交排名

题目描述

利用提供的Prime.py,打印出100以内的所有质数。 需要补充编写一个函数IsPrime(),它可以判断参数是否是质数,返回True或False。

输入输出格式

输入格式

(无)

输出格式

输出100以内的所有质数,一行一个。

输入输出样例

输入样例#1:复 制

(无)

输出样例#1:复 制

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
using namespace std;
void prime(){
	cout<<2<<endl<<3<<endl<<5<<endl<<7<<endl<<11<<endl<<13<<endl<<17<<endl<<19<<endl<<23<<endl<<29<<endl<<31<<endl<<37<<endl<<41<<endl<<43<<endl<<47<<endl<<53<<endl<<59<<endl<<61<<endl<<67<<endl<<71<<endl<<73<<endl<<79<<endl<<83<<endl<<89<<endl<<97;
}
int main(){
	prime();
	return 0;
}

97. 数字逆序提交

提交排名

题目描述

请编写一个函数reverse()的定义,作用是将一个整数形参逆序,返回新数字。 主程序为: 1. 请用户键入一个整数; 2. 使用函数reverse(),得到这个整数的逆序数字,打印出来。

输入输出格式

输入格式

一个整数

输出格式

提示,及逆序后的整数。

输入输出样例

输入样例#1:复 制

123

输出样例#1:复 制

Please input integer:
321

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

如果输入120,则输出21。

#include<bits/stdc++.h>
using namespace std;
int main(){
	string s;
	getline(cin,s);
	cout<<"Please input integer:"<<endl;
	for(int i=s.size()-1;i>=0;i--){
		if(s[i]=='0') continue;
		else cout<<s[i];
	} 
	return 0;
}

98. 倒数斐波那契提交

提交排名

题目描述

斐波那契数列为:0,1,1,2,3,5,8,13,21,… 其中的零号位置为0,1号位置为1,2号位置为1,3号位置为2,之后每项是前两项的和。 请写一个程序,输入是一个正整数n,倒序地输出斐波那契数列n号位置到0号位置的数。

输入输出格式

输入格式

一个正整数n。数据范围:0<=n<=50

输出格式

一行,包含n+1个整数,由空格隔开

输入输出样例

输入样例#1:复 制

3

输出样例#1:复 制

2 1 1 0

输入样例#2:复 制

9

输出样例#2:复 制

34 21 13 8 5 3 2 1 1 0

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
using namespace std;
long long f[60],n;
int main(){
	cin>>n;
	f[0]=0;
	f[1]=1;
	for(int i=2;i<=n;i++)
		f[i]=f[i-1]+f[i-2];
	for(int i=n;i>=0;i--) 
		cout<<f[i]<<' '; 
	return 0;
}

99. 方阵的X提交

提交排名

题目描述

给定一个4*4的方阵,请求出两个对角线上的数字总和。

输入输出格式

输入格式

输入文件square.in 输入有4行,每行有4个整数,由空格隔开,均不超过10000。

输出格式

输出文件square.out 输出一个整数。

输入输出样例

输入样例#1:复 制

5 2 2 5
3 1 1 2
3 1 1 2
5 3 3 5

输出样例#1:复 制

24

输入样例#2:复 制

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

输出样例#2:复 制

68

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
using namespace std;
int x[6][6];
int main(){
	freopen("square.in","r",stdin);
	freopen("square.out","w",stdout);
	int ans=0;
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++) 
			cin>>x[i][j];
	ans=x[1][1]+x[2][2]+x[3][3]+x[4][4]+x[1][4]+x[2][3]+x[3][2]+x[4][1];
	cout<<ans;
	return 0;
} 

100. 名字排序提交

提交排名

题目描述

此题为python作业。c++请不要提交

写一个程序,让用户提供5个名字。程序要把这5个名字保存在一个列表中,排序后打印出来。

输入输出格式

输入格式

5行字符串

输出格式

排序后的5行字符串

输入输出样例

输入样例#1:复 制

Mike
Sam
John
Tommy
Tom

输出样例#1:复 制

Enter 5 names:
The names are:
John
Mike
Sam
Tom
Tommy

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
using namespace std;
string s[5];
int main(){
	cout<<"Enter 5 names:\nThe names are:\n";
	for(int i=0;i<5;++i) cin>>s[i];
	sort(s,s+5);
	for(int i=0;i<5;++i) cout<<s[i]<<endl;
	return 0;
}

------101~105太简单了(对我来说)我不想粘了,自己写去------

106. 求后序遍历提交

提交排名

题目描述

给定二叉树的前序遍历和中序遍历序列,求该二叉树的后序遍历序列。二叉树元素是字符类型,且序列长度不超过30。

输入输出格式

输入格式

两行
第一行,先序遍历序列
第二行,中序遍历序列

输出格式

后序遍历序列

输入输出样例

输入样例#1:复 制

abdec
dbeac

输出样例#1:复 制

debca

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
void calc(int l1,int r1,int l2,int r2){
	int m=s2.find(s1[l1]);
	if(m>l2) calc(l1+1,l1+m-l2,l2,m-1);
	if(m<r2) calc(l1+m-l2+1,r1,m+1,r2);
	cout<<s1[l1];
}
int main(){
	cin>>s1>>s2;
	calc(0,s1.length()-1,0,s2.length()-1);
	cout<<endl;
	return 0; 
}

107. 求前序遍历提交

提交排名

题目描述

给定二叉树的中序遍历和后序遍历序列,求该二叉树的前序遍历序列。二叉树元素是字符类型,且序列长度不超过30。

输入输出格式

输入格式

两行
第一行,中序遍历序列
第二行,后序遍历序列

输出格式

前序遍历序列

输入输出样例

输入样例#1:复 制

abdec
dbeac

输出样例#1:复 制

caebd

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
using namespace std;
void beford(string in,string after){
    if (in.size()>0){
        char ch=after[after.size()-1];
        cout<<ch;
        int k=in.find(ch);
        beford(in.substr(0,k),after.substr(0,k));
        beford(in.substr(k+1),after.substr(k,in.size()-k-1));
    }
}
int main(){
    string a,b;
    cin>>a>>b;
    beford(a,b);
    return 0;
}

108. 最小函数值提交

提交排名

题目描述

有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci(x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。

输入输出格式

输入格式

第一行输入两个正整数n和m。
以下n行每行三个正整数,其中第i行的三个数分别位Ai、Bi和Ci。输入数据保证Ai<=10,Bi<=100,Ci<=10000。

输出格式

输出将这n个函数所有可以生成的函数值排序后的前m个元素。
这m个数应该输出到一行,用空格隔开。

输入输出样例

输入样例#1:复 制

3 10
4 5 3
3 4 5
1 7 1

输出样例#1:复 制

9 12 12 19 25 29 31 44 45 54

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

n, m<=10 000

#include<bits/stdc++.h>
using namespace std;
const int MAXN=10005;
int n,m,f[MAXN],k[MAXN][4];
struct Alg{
    int num,data;
}a[MAXN];
bool cmp(Alg x,Alg y){
    return x.data<y.data;
} 
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&k[i][1],&k[i][2],&k[i][3]);
        a[i].num=i;
        a[i].data=k[i][1]+k[i][2]+k[i][3];
    }
    for(int i=1;i<=n;i++)
        f[i]=2;
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=m;i++){
        printf("%d ",a[1].data);
        int g=a[1].num;
        a[1].data=k[g][1]*f[g]*f[g]+k[g][2]*f[g]+k[g][3];
        f[g]++;
        int now=1;
        while(now*2<=n){
            int tp=2*now;
            if(a[tp].data>a[tp+1].data && tp<n) tp++;
            if(a[tp].data<a[now].data){
                Alg kx=a[tp];
                a[tp]=a[now];
                a[now]=kx; 
                now=tp;
            }
            else  break;
        }
    }
    return 0;
}

109. 括号匹配加强版II-by汪畋宇提交

提交排名

题目描述

做了括号匹配的题(23,24)后,wangtianyu童鞋吐槽说题目弱爆了X_X 遂又出了一题更加强的版本,把括号种类从4种提升到了n种(n<=100) 括号表达式的规则不变(如下): 1.右括号左侧必须有对应的左括号 2.优先级高的括号内部不能包含优先级低的括号

输入输出格式

输入格式

第一行为一个字符串,长度为2n。其中第2i-1和2i位表示一对匹配的左右括号,i越大的括号优先级越高(越内层)
第二行为一个字符串,只包含第一行中出现的字符,表示一个括号表达式

输出格式

如果是一个合法表达式,输出一行YES,否则输出一行NO

输入输出样例

输入样例#1:复 制

{}[]()<>
{[]<()>}

输出样例#1:复 制

NO

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
char br[109],bl[109];
int f;
int find(char ch){
    for(int i=0;i<s1.size()/2;i++) if(ch==bl[i]){f=1;return i+1;}
    for(int i=0;i<s1.size()/2;i++) if(ch==br[i]){f=2;return i+1;}
    f=0;
	return -1;
}
int main(){
    getline(cin,s1);
    getline(cin,s2);
    for(int i=0;i<s1.size();i++)
        if(i%2==1) br[i/2]=s1[i];
        else bl[i/2]=s1[i];
    char ch;
    int top=0,k=0,kf=0;
    char stk[309];
    bool flag=true;
    for(int i=0;i<s2.size()&&flag;i++){
        ch=s2[i];
        k=find(ch);
        kf=f;
        if(kf==1){
            if(k==s1.size()/2) top++,stk[top]=ch;
            else if(top==0||(top!=0&&k>=find(stk[top]))) top++,stk[top]=ch;
            else flag=false;
        }
        else if(kf==2){
            if(k==find(stk[top])&&f==1) top--;
            else flag=false;
        }
    }
    if(top>0) flag=false;
    if(flag) cout<<"YES";
    else cout<<"NO";
    return 0;
}

110没做出来求各位大佬指教

112. 抓住那头牛(BestAC by李晗之)提交

提交排名

题目描述

lester知道一头牛的位置,想要抓住它。lester和牛都位于数轴上,lester起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。lester有两种移动方式: 1. 从X移动到X-1或X+1,每次移动花费一分钟 2. 从X移动到2*X,每次移动花费一分钟 假设牛没有意识到lester的行动,站在原地不动。lester最少要花多少时间才能抓住牛?

输入输出格式

输入格式

两个整数,N和K

输出格式

一个整数,lester抓到牛所要花费的最小分钟数

输入输出样例

输入样例#1:复 制

5 17

输出样例#1:复 制

4

输入样例#2:复 制

输出样例#2:复 制

输入样例#3:复 制

输出样例#3:复 制

说明

0<=N<=100000, 0<=K<=100000

#include<bits/stdc++.h>
using namespace std;
queue<int> q;
int n,k,f[100001];
int main(){
	cin>>n>>k;
	for(int i=0;i<=100000;i++){
		f[i]=-1;
	}
	f[n]=0;
	q.push(n);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		if(x-1>=0 && x-1<=100000){
			if(f[x-1]==-1){
				f[x-1]=f[x]+1;
				q.push(x-1);
			}
		}
		if(x+1>=0 && x+1<=100000){
			if(f[x+1]==-1 || f[x+1]>f[x]+1){
				f[x+1]=f[x]+1;
				q.push(x+1);
			}
		}
		if(x*2>=0 && x*2<=100000){
			if(f[x*2]==-1 || f[x*2]>f[x]+1){
				f[x*2]=f[x]+1;
				q.push(x*2);
			}
		}
	}
	cout<<f[k]<<endl;
	return 0;
}

113. 合并果子(BestAC by 韦博瀚/李坦达)提交

提交排名

题目描述

在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。 例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。

输入输出格式

输入格式

输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。

输出格式

输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于2^31。

输入输出样例

输入样例#1:复 制

3 
1 2 9 

输出样例#1:复 制

15

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
#include<set>
using namespace std;
typedef long long ll;
multiset<ll> s;
int main(){
	multiset<ll>::iterator it;
	ll n,ans=0;
	cin>>n;
	for(ll i=1;i<=n;i++){ll x; cin>>x; s.insert(x);}
	while(s.size()>=2){
		it=s.begin();
		ll a=*it;
		s.erase(it);
		it=s.begin();
		ll b=*it;
		s.erase(it);
		s.insert(a+b);
		ans+=a+b;
	}
	cout<<ans;
	return 0;
}

114没AC

115. 分数排序提交

提交排名

题目描述

输入一个自然数N,按照升序输出分母小于等于N的既约真分数。即输入一个自然数N,对于一个最简分数a/b(分子和分母互质的分数),满足1<=b<=N,0<=a/b<=1,请找出所有满足条件的分数。

输入输出格式

输入格式

一行 一个自然数N

输出格式

升序序列,每个分数单独占一行

输入输出样例

输入样例#1:复 制

5

输出样例#1:复 制

0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

1<=N<=160

#include<bits/stdc++.h>
using namespace std;
int n,i=2;
void falei(int a,int b,int c,int d){
	if(b+d>n) return;
	falei(a,b,a+c,b+d);
	cout<<a+c<<'/'<<b+d<<endl;
	i++;
	falei(a+c,b+d,c,d);
}
int main(){
	cin>>n;
	int a,b,c,d;
	cout<<"0/1"<<endl;
	falei(0,1,1,1);
	cout<<"1/1";
	return 0;
}

116也没弄出来

117. 卡特兰数提交

提交排名

题目描述

卡特兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时数学家卡塔兰 (1814–1894)的名字来命名,其前几项为 : 1, 1, 2, 5, 14, 42, 132, … 卡特兰数第零项h(0)=1,第一项h(1)=1,之后每项存在规律。当k>=2时,Catalan数满足几种常见的推导方式: 方法1: h(k)= h(0)*h(k-1)+h(1)*h(k-2) + ... + h(k-1)*h(0) 方法2: h(k)=h(k-1)*2*(2*k-1)/(k+1) 请写一个程序,输入是一个正整数,输出是第n项的卡特兰数。

输入输出格式

输入格式

输入是一个正整数

输出格式

输出是第n项的卡特兰数。

输入输出样例

输入样例#1:复 制

16

输出样例#1:复 制

35357670

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

说明: n<=30

#include<bits/stdc++.h>
using namespace std;
unsigned long long h[39],n;
int main(){
	cin>>n;
	h[1]=1;
	for(int i=2;i<=n;i++) h[i]=h[i-1]*2*(2*i-1)/(i+1);
	cout<<h[n];
	return 0;
}

118. 最小公倍数提交

提交排名

题目描述

请写一个程序,输入是两个正整数,输出是他们的最小公倍数。 说明:最小公倍数英文叫做Least Common Multiple,简写LCM。

输入输出格式

输入格式

两个正整数,均不超过1000000000

输出格式

一个正整数

输入输出样例

输入样例#1:复 制

4 6

输出样例#1:复 制

12

输入样例#2:复 制

输出样例#2:复 制

输入样例#3:复 制

输出样例#3:复 制

说明

#include<bits/stdc++.h>
using namespace std;
long long a,b;
long long gcd(int x,int y){
	if(x%y==0) return y;
	else return gcd(y,x%y); 
}
int main(){
	cin>>a>>b;
	cout<<a*b/gcd(a,b);
	return 0;
} 

119. 砖头和金字塔提交

提交排名

题目描述

请修改以下pyramid.cpp程序,能输入正整数n和一个字符c,输出用符号c作为“砖头”搭建的高度为n的金字塔和高度为2n的金字塔,共两座金字塔

1

2

3

4

5

6

7

8

9

10

11

12

#include<iostream>

using namespace std;

int n; char c;

void pyramid(int m,char x){

    //请在此处加入代码

}

int main(){

    cin>>n>>c;

    pyramid(n,c);

    pyramid(2*n,c);

    return 0;

}

输入输出格式

输入格式

输入为一个正整数,一个字符。

输出格式

输出为3n行,每行行末不可以有多余空格。

输入输出样例

输入样例#1:复 制

3 $

输出样例#1:复 制

  $
 $$$
$$$$$
     $
    $$$
   $$$$$
  $$$$$$$
 $$$$$$$$$
$$$$$$$$$$$

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<iostream>
using namespace std;
int n; char c;
void pyramid(int m,char x){
    for(int i=0;i<m;i++){                                         
        for(int j=0;j<=m-i-2;j++){                                     
            cout<<" ";                       
            } 
        for(int j=0;j<2*i+1;j++){   
            cout<<c;
        }
        cout<<endl;
    }
}
int main(){
    cin>>n>>c;
    pyramid(n,c);
    pyramid(2*n,c);
    return 0;
}

120. 二分查找提交

提交排名

题目描述

给出有n个元素的由小到大的序列,找出某元素第一次出现的位置。

输入输出格式

输入格式

第一行 一个整数,表示由小到大序列元素个数
下面n行,每行一个整数
最后一行一个整数x,表示待查找的元素

输出格式

如果x在序列中,则输出x第一次出现的位置,否则输出-1

输入输出样例

输入样例#1:复 制

5
3
5
6
6
7
6

输出样例#1:复 制

3

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

n<=100000

#include<bits/stdc++.h>
#define N 100004
using namespace std;
int n,f,ans,x[N];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>x[i];
	cin>>f;
	ans=lower_bound(x+1,x+1+n,f)-x;
	cout<<(*lower_bound(x+1,x+1+n,f)==0?-1:ans);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值