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;
}