1.22学习博客

今天继续总结冬令营的题目
结构体排序
第一题:

在这里插入图片描述
在这里插入图片描述
我们可以设宾馆序列为h,宾馆用结构体表示,h[i].dist表示第i个宾馆离海边的距离,h[i].cost表示该宾馆的价格,根据题意,我们以距离为第一关键字,以价格为第二关键字,对宾馆序列进行排序,然后对排序之后的序列进行候选宾馆数量的遍历。根据题意,如果a宾馆离海边的距离小于b宾馆离海边的距离,则b宾馆的价格一定比a宾馆低才能算入候选宾馆。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10000;
struct hotel{
    
    
	int dist;
	int cost;
}h[maxn];
int com(hotel a,hotel b){
    
    
	if(a.dist==b.dist)return a.cost<b.cost;//距离相等以宾馆价格低的优先
	return a.dist<b.dist;
}
int main(){
    
    
	int n;
	while(scanf("%d",&n)!=EOF&&n){
    
    
		int i;
		for(i=0;i<n;i++)
		 scanf("%d%d",&h[i].dist,&h[i].cost);
		sort(h,h+n,com);//结构体排序,结合com函数,这里sort是以第一关键字从小到大排序
		int min=INT_MAX;
		int ans=0;
		for(i=0;i<n;i++){
    
    
			if(h[i].cost<min){
    
    //符合
				ans++;//计数
				min=h[i].cost;//更新
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

第二题:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于该题,我们用结构体来存储学生信息的序列,然后以分数为第一关键字,准考证号为第二关键字,进行排序,再判断达到分数线的人数,并输他们的信息即可。

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 1005
int que[15];//考题的正整数分值
struct node{
    
    
	char name[25];//考号
	int num;//解决的题目数
	int sum;//分数
}stu[N];
int cmp(node a,node b){
    
    //结构体比较函数
	if(a.sum==b.sum)return strcmp(a.name,b.name)<0?1:0;//分数相等以考号升序排序
	else return a.sum>b.sum;
}
int main(){
    
    
	int stu_num,text_num,line,a,cnt;//stu_num考生数,text_num考题数,line分数线
	while(scanf("%d",&stu_num)!=EOF&&stu_num){
    
    
		cnt=0;
		int i;
		scanf("%d%d",&text_num,&line);
		for(i=1;i<=text_num;i++)//输入考题的正整数分值
		 scanf("%d",&que[i]);
		for(i=1;i<=stu_num;i++){
    
    
			stu[i].sum=0;
			scanf("%s%d",stu[i].name,&stu[i].num);//单个学生的考号和解题数
			while(stu[i].num--){
    
    //根据题号统计分数
				scanf("%d",&a);
				stu[i].sum+=que[a];//计算单个同学的分数
			}
			if(stu[i].sum>=line)cnt++;//通过分数线
		}
		sort(stu+1,stu+1+stu_num,cmp);//结构体排序//从stu[1]开始
		cout<<cnt<<endl;//输出不低于分数线的人数
		for(i=1;i<=stu_num;i++){
    
    //排好序后按分数从高到低输出上线考生的考号和分数,分数相同则按考号升序输出
			if(stu[i].sum>=line)printf("%s %d\n",stu[i].name,stu[i].sum);
		    else break;
		}
	}
	return 0;
}

第三题:
在这里插入图片描述
在这里插入图片描述
对于该题,我们可以建立结构体来存储奶牛的信息,包括他们第一轮的票数,第二轮的票数,编号。然后以第一轮票数为第一关键字,进行降序排序,然后再对其前k名进行以第二轮票数为第一关键字的降序排序,之后输出第一名即可。

#include<iostream>
#include<algorithm>
using namespace std;
const int MAX=50010;
int n,k;
struct node{
    
    
	int a;//第一轮预期得票
	int b;//第二轮预期得票
	int num;
}cow[MAX];
int cmpa(node p,node q){
    
    //先按a从大到小排序,若a相等则按b从大到小排序
	if(p.a==q.a)return p.b>q.b;
	return p.a>q.a;
}
int cmpb(node p,node q){
    
    //先按b从大到小排序,若b相等则按a从大到小排序
	if(p.b==q.b)return p.a>q.a;
	return p.b>q.b;
}
int main(){
    
    
	int i;
	while(scanf("%d%d",&n,&k)!=EOF){
    
    
	for(i=0;i<n;i++){
    
    
		scanf("%d%d",&cow[i].a,&cow[i].b);
		cow[i].num=i+1;//牛的编号
	}
	sort(cow,cow+n,cmpa);//第一次排序,n头牛第一轮得票排序
	sort(cow,cow+k,cmpb);//第二次排序,第一次排好序后的前k头牛,第二轮得票排序
	printf("%d\n",cow[0].num);//输出二次排序后的第一名
    }
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_47529865/article/details/112998665