模拟习题练习1

1.30日

一、

题目描述

小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词--DNA.它有一个双螺旋的结构。这让一根筋的小强抓破头皮,“要是能画出来就好了” 小强喊道。现在就请你帮助他吧

输入格式

输入包含多组测试数据。第一个整数N(N<=15),N表示组数,每组数据包含两个整数a,b。a表示一个单位的DNA串的行数,a为奇数且 3<=a<=39。b表示重复度(1<=b<=20)。

输出格式

输出DNA的形状,每组输出间有一空行。

样例输入

2
3 1
5 4

样例输出

X X
 X
X X

X   X
 X X
  X
 X X
X   X
 X X
  X
 X X
X   X
 X X
  X
 X X
X   X
 X X
  X
 X X
X   X
#include <stdio.h>

int main()
{
	while (1){
		int a, b, n;
		scanf("%d", &n);
		while (n--)
		{
			scanf("%d %d", &a, &b);
			//打印第一行
			for (int i = 0; i < a; i++)
			{
				if (i == 0 || i == a - 1)
				{
					printf("X");
				}
				else
				{
					printf(" ");
				}
			}
			printf("\n");
			while (b--)
			{
				for (int i = 1; i < a; i++)
				{
					for (int j = 0; j < a; j++)
					{
						if (j + i == (a - 1) || j == i)
						{
							printf("X");
						}
						else
						{
							printf(" ");
						}
					}
					printf("\n");
				}

			}
			printf("\n");
		}

	}
	return 0;
}

二、

题目描述

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

输入格式

输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。

输出格式

对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。

样例输入

2
4
5
0

样例输出

2
4
6

用递归去做(简单的递归问题)

#include<iostream>
using namespace std;

long long cow[56] = { 0, 1, 2, 3, 4 }; // 在main函数外定义的数组会全部自动初始化为0

long long fab(int month) {
	if (cow[month] == 0) { // 没有算过的月份,数组内存的是0
		cow[month] = fab(month - 1) + fab(month - 3);
		return cow[month];
	}
	else {
		return cow[month];
	}
}
int num(int n)
{
	if (n < 5)
	{
		return n;
	}
	else
	{
		return num(n - 1) + num(n - 3);//不断累积就是今年的产出量
	}
}
int main() {
	int n;
	while (scanf("%d", &n) && n) cout << num(n) << endl;//不要用while(1)否则会超时
	//重要经验
	/*while (1)
	{
		scanf_s("%d", &n);
		printf("%d", num(n));

	}*/return 0;
}

三、

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

输入格式

输入包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

输出格式

输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

样例输入

100 200 150 140 129 134 167 198 200 111
110

样例输出

5
#include<stdio.h>
int main()
{
	
		int n[10];
		int a = 0;
		int b = 0;
		for (int i = 0; i < 10; i++)
		{
			scanf("%d", &n[i]);
		}
		scanf("%d", &b);//小强的身高
		for (int i = 0; i < 10; i++)
		{
			if (n[i] <= (b + 30))
			{
				a++;
			}
		}
		printf("%d", a);
	
	return 0;
}

四、

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7 279

5 279

这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:

5 279

7 279

则按输出错误处理,不能得分。

输入格式

输入包含n+1行:

第1行为一个正整数n,表示该校参加评选的学生人数。

第2到n+1行,每行有3个用空格隔开的数字,每个数字都在O到100之间z第1行的3个数 字依次表示学号为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为l~n (恰好是输入数据的行号减1)。

所给的数据都是正确的,不必检验。

输出格式

输出共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。

样例输入

6  	 	 
90 67 80	 
87 66 91   	
78 89 91   	 
88 99 77   	 
67 89 64       
78 89 98  

样例输出

6 265
4 264
3 258
2 244
1 237

第一遍存在问题的代码如下

#include<stdio.h>
#include<stdlib.h>
//这段代码问题排序时num1没有改变顺序
int main()
{
	while (1)
	{

		int n = 0;
		int num1[1000] = { 0 };
		int num2[1000] = { 0 };
		int num3[1000] = { 0 };
		int num[1000] = { 0 };
		int person[1000] = { 0 };
		scanf("%d",&n);
		//蓝桥杯尽量不要使用malloc 直接开大内存就行了
		/*int*num1 = (int*)calloc(n, sizeof(int));
		int*num2 = (int*)calloc(n, sizeof(int));
		int*num3 = (int*)calloc(n, sizeof(int));
		int*person = (int*)calloc(n, sizeof(int));
		int*num = (int*)calloc(n, sizeof(int));*/
		for (int i = 0; i < n; i++)
		{

		/*	printf("%d\n", i);*/
			scanf("%d %d %d", &num1[i], &num2[i], &num3[i]);
			/*printf("%d %d %d\n", num1[i], num2[i], num3[i]);*/
		}
		for (int i = 0; i < n; i++)
		{
			num[i] = num1[i] + num2[i] + num3[i];
			person[i] = i + 1;
			/*printf("%d ", num[i]);
			printf("%d\n", person[i]);*/
		}
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n - i; j++)
			{
				if (num[j] < num[j + 1])
				{
					int a = 0;
					int b = 0;
					a = num[j];
					num[j] = num[j + 1];
					num[j + 1] = a;
					b = person[j];
					person[j] = person[j + 1];
					person[j + 1] = b;
				}

			}
		}
		for (int i = 0; i < n; i++)
		{
			if (num[i] == (num[i + 1]))
			{
				if (num1[i] < num1[i + 1])//比较语文成绩

				{
					int a = 0;
					int b = 0;
					a = num[i];
					num[i] = num[i + 1];
					num[i + 1] = a;
					b=person[i];
					person[i] = person[i + 1];
					person[i + 1] = b;
				}
				else if(num1[i] == num1[i + 1])
				{
					if (person[i] > person[i + 1])
					{
						int a = 0;
						int b = 0;
						a=num[i];
						num[i] = num[i + 1];
						num[i + 1] = a;
						b=person[i];
						person[i] = person[i + 1];
						person[i + 1] = b;
					}
				}
			}
		}
		for (int i = 0; i < 5; i++)
		{
			printf("%d ", person[i]);
			printf("%d", num[i]);
			printf("\n");
			printf("%d\n", num1[i]);
		}
	}
	return 0;
}

问题:第一遍不考虑语文和学号方面 ,排序时只是将总成绩大小进行排序,没有对单科成绩进行单独的排序,导致出现问题,解决方法:利用结构体

 改进:(更加简洁)

#include<iostream>
#include<algorithm>
using namespace std;
struct student
{
	int id, Chinese, score;
}stu[1000];
bool sort_rule(student a, student b)
{
	if (a.score != b.score)
		return a.score>b.score;
	else
	{
		if (a.Chinese != b.Chinese)
			return a.Chinese>b.Chinese;
		else
			return a.id<b.id;
	}
}
int main()
{
	while (1){
		int n, Chinese, Math, English;
		cin >> n;
		for (int i = 1; i <= n; i++)
		{
			cin >> Chinese >> Math >> English;
			stu[i].Chinese = Chinese;
			stu[i].score = Chinese + Math + English;
			stu[i].id = i;
		}
		sort(stu + 1, stu + n + 1, sort_rule);
		for (int i = 1; i <= 5; i++)
			cout << stu[i].id << " " << stu[i].score << endl;
	}
	return 0;
}

 

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值