洛谷-【入门4】数组

1.小鱼比可爱

题目描述

人比人,气死人;鱼比鱼,难死鱼。小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度。参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只鱼的可爱程度,很显然整数越大,表示这只鱼越可爱,而且任意两只鱼的可爱程度可能一样。由于所有的鱼头都朝向左边,所以每只鱼只能看见在它左边的鱼的可爱程度,它们心里都在计算,在自己的眼力范围内有多少只鱼不如自己可爱呢。请你帮这些可爱但是鱼脑不够用的小鱼们计算一下。

输入格式

第一行输入一个正整数n,表示鱼的数目。

第二行内输入 n个正整数,用空格间隔,依次表示从左到右每只小鱼的可爱程度 ai。

输出格式

一行,输出 n 个整数,用空格间隔,依次表示每只小鱼眼中有多少只鱼不如自己可爱。

#include <stdio.h>
int main(){
   
	int n,a[100];
	scanf("%d",&n);
	for(int i=0;i<n;i++){
   
		scanf("%d",&a[i]);
		getchar();
		int count=0;
		for(int j=0;j<i;j++){
   
			if(a[j]<a[i])count++;
		}
		printf("%d ",count);
	}
	return 0;
}

样例输入 #1

6
4 3 0 5 1 2

样例输出 #1

0 0 0 3 1 2

提示

对于 100%的数据,1 <=n<=100,0 <=ai <=10。

2.小鱼的数字游戏

题目描述

小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字ai(长度不一定,以 0结束),记住了然后反着念出来(表示结束的数字0 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。

输入格式

一行内输入一串整数,以0结束,以空格间隔。

输出格式

一行内倒着输出这一串整数,以空格间隔。

#include <stdio.h>
int main(){
   
	int a[100]={
   1},i=-1;
	do{
   
		i++;
		scanf("%d",&a[i]);
		getchar();
	}while(a[i]!=0);
	for(int j=i-1;j>=0;j--){
   
		printf("%d ",a[j]);
	}
	return 0;
}

样例输入 #1

3 65 23 5 34 1 30 0

样例输出 #1

30 1 34 5 23 65 3

提示

对于100% 的数据,保证 0 <= ai <= 2^{31} - 1,数字个数不超过 100。

3.冰雹猜想

题目描述

给出一个正整数 n,然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 3 再加 1,否则除以2。经过若干次循环后,最终都会回到1。经过验证很大的数字(7*10^{11})都可以按照这样的方式比变成1,所以被称为“冰雹猜想”。例如当n 是 20,变化的过程是20->10->5->16->8-> 4-> 2-> 1 。

根据给定的数字,验证这个猜想,并从最后的 1开始,倒序输出整个变化序列。

输入格式

输入一个正整数 n。

输出格式

输出若干个由空格隔开的正整数,表示从最后的1 开始倒序的变化数列。

#include <stdio.h>
int main(){
   
	int n,i=0;
	int a[200];
	scanf("%d",&n);
	while(n!=1){
   
		a[i++]=n;
		if(n%2==0){
   
			n/=2;
		}else n=n*3+1;
	}
	a[i]=1;
	for(;i>=0;i--){
   
		printf("%d ",a[i]);
	}
	return 0;
}

样例输入 #1

20

样例输出 #1

1 2 4 8 16 5 10 20

提示

数据保证,1 <= n<=100。

4.校门外的树

题目描述

某校大门外长度为1 的马路上有一排树,每两棵相邻的树之间的间隔都是1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0的位置,另一端在1 的位置;数轴上的每个整数点,即 0,1,2,…,l,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式

第一行有两个整数,分别表示马路的长度1 和区域的数目 m。

接下来m 行,每行两个整数 u, v,表示一个区域的起始点和终止点的坐标。

输出格式

输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。

#include <stdio.h>
int main(){
   
	int l,m,u,v,flag[10010]={
   0};
	scanf("%d %d",&l,&m);
	l+=1;
	for(int i=0;i<m;i++){
   
		scanf("%d %d",&u,&v);
		for(int j=u;j<=v;j++){
   
			if(flag[j]==0){
   
				flag[j]=1;
				l--;
			}
		}
		
	}
	printf("%d",l);
	return 0;
}

样例输入 #1

500 3
150 300
100 200
470 471

样例输出 #1

298

提示

对于100% 的数据,保证 1 <= l <= 10^4,1 <= m <= 100,0 <= u <= v <= l。

5.旗鼓相当的对手

题目描述

现有N名同学参加了期末考试,并且获得了每名同学的信息:语文、数学、英语成绩(均为不超过 150 的自然数)。如果某对学生<i,j>的每一科成绩的分差都不大于5,且总分分差不大于10,那么这对学生就是“旗鼓相当的对手”。现在想知道这些同学中,有几对“旗鼓相当的对手”?同样一个人可能会和其他好几名同学结对。

输入格式

第一行一个正整数N。

接下来N行,每行三个整数,其中第i行表示第i名同学的语文、数学、英语成绩。最先读入的同学编号为 1。

输出格式

输出一个整数,表示“旗鼓相当的对手”的对数。

#include <stdio.h>
#include <math.h>
int main(){
   
	int n,score[1000][4],i,j,count=0;
	scanf("%d",&n);
	for(i=0;i<n;i++){
   
		int all=0;
		for(j=0;j<3;j++){
   
			scanf("%d",&score[i][j]);
			all+=score[i][j];			//算出三门成绩的总分
		}
		score[i][j]=all;
	}
	for(i=0;i<n-1;i++){
   
		for(j=i+1;j<n;j++){
   
			for(int k=0;k<3;k++){
   	//3门成绩+1总分 比较
				if(abs(score[i][k]-score[j][k])>5||abs(score[i][3]-score[j][3])>10)break;
				if(k==2)count++;
			}
		}
	}
	printf("%d",count);
	return 0;
}

样例输入 #1

3
90 90 90
85 95 90
80 100 91

样例输出 #1

2

提示

数据保证,2<=N<=1000且每科成绩为不超过 150的自然数。

6.工艺品制作

题目描述

现有一个长宽高分别为w,x,h组成的实心玻璃立方体,可以认为是由1×1×1的数个小方块组成的,每个小方块都有一个坐标 ( i,j,k )。现在需要进行q次切割。每次切割给出(x1,y1,z1),(x2,y2,z2)这 6 个参数,保证x1<=x2,y1<=y2,z1<=z2;每次切割时,使用激光工具切出一个立方体空洞,空洞的壁平行于立方体的面,空洞的对角点就是给出的切割参数的两个点。

换句话说,所有满足 x1<=i<=x2,y1<=j <=y2,z1<=k<=z2的小方块(i,j,k)的点都会被激光蒸发。例如有一个 4×4×4的大方块,其体积为64;给出参数(1,1,1),(2,2,2)时,中间的8块小方块就会被蒸发,剩下56个小方块。现在想知道经过所有切割操作后,剩下的工艺品还剩下多少格小方块的体积?

输入格式

第一行三个正整数w,x,h。

第二行一个正整数q。

接下来q行,每行六个c整数(x1,y1,z1),(x2,y2,z2)。

输出格式

输出一个整数表示答案。

#include <stdio.h>
int main(){
   
	int w,x,h,count=0,flag[21][21][21]={
   0};
	scanf("%d %d %d",&w,&x,&h);
	int q;
	scanf("%d",&q);
	while(q--){
   			//每一次切割
		int x1,y1,z1,x2,y2,z2;
		scanf("%d %d %d %d %d %d",&x1,&y1,&z1,&x2,&y2,&z2);
		for(int i=x1;i<=x2;i++){
   
			for(int j=y1;j<=y2;j++){
   
				for(int k=z1;k<=z2;k++){
   			//坐标i,j,k
					if(flag[i][j][k]==0){
   
						count++<
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值