《算法笔记》学习笔记:3.2查找

本节目录

B1041 考试座位号

题目描述
思路: 因为需要用试机座位号码来查询考生座位号,所以用结构体数组,试机座位号作为下标,存放相应输入数据在结构体中的位置,当查询时,直接将输入的试机座位号作为下标就可以查找到其在结构体数组中的下标,代码如下所示

#include<cstdio>
#include<cstring>
struct TNumber{
	char zNum[30];						//准考证号
	int kNum;							// 考场座位号
}TNum[1010];

int search[1010];
int main(){
	int n,m,i=0;						// 考生人数,待查询的次数
	scanf("%d",&n);
	memset(search,0,sizeof(search));
	memset(TNum,0,sizeof(TNum));
	while(n--){
		int j=0;
		scanf("%s %d %d",TNum[i].zNum,&j,&TNum[i].kNum);		// 准考证号,试机号,考场座位号
		search[j] = i++;				// 试机座位号作为下标,存放相应输入数据在结构体中的位置
	}
	scanf("%d",&m);                     //查询个数
	while(m--){
		int j=0;
		scanf("%d",&j);                 // 欲查询的试机座位号,以此为下标直接查找考生
		i = search[j];
		printf("%s %d\n",TNum[i].zNum,TNum[i].kNum);
	}
	
	return 0;
} 

B1004 成绩排名

题目描述
用结构体数组来存放待输入的数据,为了得到分数最高和最低的两个学生的数据,可以设置变量max和min分别存放最高分和最低分数据在数组中的位置,当有更高的或者更低的分出现的话,便更新变量max或min的值,具体实现如下所示

#include<cstdio>
#include<cstring>
struct Student{
	char name[20];				// 姓名
	char Number[20];			// 学号
	int score;					// 成绩
}stu[1010];

int main()
{
	int n,max=0,min=0,i=0;
	memset(stu,0,sizeof(stu));
	scanf("%d",&n);				// 学生总人数
	while(n--){
		scanf("%s %s %d",stu[i].name,stu[i].Number,&stu[i].score); // 姓名 学号 成绩
		if(stu[i].score>stu[max].score){				// 出现更高的分,更新max的值
			max = i;
		}
		if(stu[i].score <stu[min].score){				// 出现更低的分,更新min的值
			min = i;
		}
		i++;
	}
	printf("%s %s\n",stu[max].name,stu[max].Number);	// 分别输出最高分和最低分的姓名和学号
	printf("%s %s\n",stu[min].name,stu[min].Number);
	
	return 0;
}

B1028 人口普查

题目描述
创建一个结构体来接收数据,设置变量temp用来每次接收临时的数据,因为生日具有有效日期,可以设计两个边界变量left和right,同时设置oldest和young来存放最年老和最年轻的居民的信息。每次接收数据后判断是否在边界范围内,再将其分别与年轻与老人对比,若更年轻或更老,就更新young后oldest中的数据。对比方法为,大致的计算出每个合法生日到两百年前第一天的天数,若小,则年老一点,否则年轻。

#include<cstdio>
struct People{
	char name[20];					// 姓名
	int yy,mm,dd,sum;				//生日的 年,月,日,个体时间差
}temp,oldest,young,left,right;		// 临时接收数据变量,年老和年轻变量及两个边界量

void init(){						// 进行变量初始化
	left.yy = young.yy = 1814;		// 左边间最开始设置最小
	left.mm = young.mm = 9;
	left.dd = young.dd = 6;
	right.yy = oldest.yy = 2014;	// 右边界设置最大
	right.mm = oldest.mm = 9;
	right.dd = oldest.dd = 6;
	left.sum = young.sum = 9*30+6;		
	right.sum = oldest.sum = 200*365+9*30+6;
}
int main(){
	int n,num = 0;		// num为合法生日居民人数
	init(); 
	scanf("%d",&n);		// 居民人数
	while(n--){			// 姓名,年,月,日
		scanf("%s %d/%d/%d",temp.name,&temp.yy,&temp.mm,&temp.dd);
		temp.sum = (temp.yy-1814)*365 + temp.mm*30 + temp.dd;
		if(temp.sum>=left.sum && temp.sum <= right.sum){		// 判断是否在生日范围内
			num++;
			if(temp.sum<oldest.sum){					// 若更年老,则更新数据
				oldest = temp;
			} 
			if(temp.sum>young.sum){						// 若更年轻,则更新数据
				young = temp;
			}
		}
	}
	if(num!=0){											// 若有合法居民,输出年长者和年轻者信息
		printf("%d %s %s\n",num,oldest.name,young.name);
	}else printf("0\n");								// 否则输出零
	
	return 0;
}

B1032 挖掘机技术那家强

题目描述
按照题意模拟即可,代码如下所示

#include<stdio.h>
#include<string.h>
#define N 100001
int main()
{
	int n,num,score,MaxI=0;		// 拖拉机考试数,学校下标,考试分数,最高分下标
	int a[N];					// 每个学校总分数
	memset(a,0,sizeof(a));
	scanf("%d",&n);				// 拖拉机考试数
	while(n--){
		scanf("%d%d",&num,&score);	// 学校下标,考试分数
		a[num] += score;
		if(a[num]>a[MaxI]){			// 若当前学校分数超出上一次最高分,则将下标更新
			MaxI = num;
		}
	}
	printf("%d %d",MaxI,a[MaxI]);		//输出,学校下标和学校总分数
	
	return 0;
}

A1011 World Cup Betting

题目描述
因为最终要输出每一组数据中投的是赢,输,还是平局的符号,并且每一组都需要记录最高的赔率,故每一次输入一组数据时,都记录其中最大的赔率和其符号,所以可以将每一组的最大数据依次放在数组里面,其符号依次放在另外一个字符数组里,最后将数据输出,得到结果,具体实现代码如下:

#include<cstdio>
#include<cstring>

char sign[3] = {'W','T','L'};			//标志数组 
float temp[3],ends[3];					// 临时数组,存放结果的数组 
char end[3];							// 存放结果标志的数组 

int main()
{
	float sum=0;	
	for(int i=0;i<3;i++){
		memset(temp,0,sizeof(temp));	// 每次输入一组数据时,将数组清零
		float max = 0;					// 记录当前的数据
		int index=0;					// 记录最大数据,在临时数组中的下标
		for(int j=0;j<3;j++){
			scanf("%f",&temp[j]);
			if(temp[j]>max){
				index = j;
				max = temp[j];
			}
		}
		ends[i] = temp[index];			// 保存一组数中最大的数
		end[i] = sign[index];			// 保存,最大数的符号
	} 
	sum = (ends[0]*ends[1]*ends[2]*0.65-1)*2;		// 计算最终的收益
	for(int i=0;i<3;i++){							// 依次输出结果
		printf("%c ",end[i]);
	} 
	printf("%.2f\n",sum);
	
	return 0;
}

A1006 Sign In and Sign Out

题目描述
最终要输出,最先进和最后进的人的名字,所以要保存最先进和最后出的名字,可以设置一个临时变量,最先进入和最后出去变量,最开始将最先进入和最后进入的时间都设置为最大和最小,每次输入数据时都进行比较,若小于(大于)最先进入(最后出去)的变量,就将相应的变量更新,最后输出两个变量。

#include<cstdio>
#include<cstring>
struct Word{
	char name[20];								// 名字
	char inTime[20];							// 进入时间
	char outTime[20];							// 出去时间
}temp,first,last;								// 最先进和最后出去的 

void init(){									// 将时间初始化 
	strcpy(first.inTime,"23:59:59");
	strcpy(last.outTime,"00:00:00");
}
int main()
{
	int n;
	init();
	scanf("%d",&n);
	while(n--){
		scanf("%s %s %s",temp.name,temp.inTime,temp.outTime);
		if(strcmp(first.inTime,temp.inTime)>0){			//通过字符串比较判断两个时间的大小,大于则更新 
			first = temp;
		}
		if(strcmp(last.outTime,temp.outTime)<0){		// 大于则更新
			last = temp;
		}
	}
	printf("%s %s\n",first.name,last.name);				// 输出数据
	return 0;
}

A1036 Boys VS Girls

题目描述
结果要输出分数最高的女生,和分数最低的男生并且要输出二者的分数差(男生好难啊,学渣的痛苦,考的不高就算了,还有和女生最高分算差值),用结构体来表示每个学生的信息,设置三个量分别用来保存临时输入的数据,女生最高分,男生最低分的数据。每次输入的时候进行比较,若满足条件就更新女高或男低的量。当男生女生有一个为零的时候对应输出的地方输出Absent 同时原来输出分数差的那一行输出NA,所以分别设置mnum,funm,统计男女的人数,最后输出的时候作为判断,具体代码如下:

#include<cstdio>
struct Student{
	char name[20];				// 姓名
	char gender;				// 性别
	char id[20];				// 科目号
	int score;					// 分数
}temp,Hfm,Lm;					//临时变量,分数最高女生,和分数最低男生

void init(){					// 将最高女生分数初始化为0,最低男生分数初始化为100 
	Hfm.score = 0;
	Lm.score = 100;
} 

int main()
{
	int n,mnum=0,fnum=0;					// 统计男女生人数 
	init();
	scanf("%d",&n);
	while(n--){
		scanf("%s %c %s %d",temp.name,&temp.gender,temp.id,&temp.score);
		if(temp.gender == 'F'){		//若是女生
			fnum++;
			if(temp.score>Hfm.score){	// 该女生分数更高,保存其信息
				Hfm = temp;
			}
		}else if(temp.gender == 'M'){	// 若是男生
			mnum++;
			if(temp.score < Lm.score){	// 该男生分数更低,保存其信息
				Lm = temp;
			}
		}
	}
	if(fnum!=0){						// 若女生人数不为零
		printf("%s %s\n",Hfm.name,Hfm.id);
	}else printf("Absent\n");
	if(mnum != 0){						// 若男生人数不为零
		printf("%s %s\n",Lm.name,Lm.id);
	}else printf("Absent\n");
	
	if(fnum && mnum){					// 若男女生人数都不为零
		printf("%d\n",Hfm.score-Lm.score);
	}else printf("NA\n");
	
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值