结构体排序

结构体排序

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
 
//结构体排序一  ----定义cmp函数
//按姓名从小到大排序,姓名一样,按年龄从小到大排序 
struct student{
    string name; 
    int age;
}; 
bool cmp(const student &s1,const student &s2){//自己定义的排序规则 
    if(s1.name==s2.name)
        return s1.age<s2.age;
    return s1.name<s2.name;
} 
//结构体排序二  --- 结构体内重载 <
//按姓名从小到大排序,姓名一样,按年龄从小到大排序 
struct student2{
    string name;
    int age;
    bool operator < (const student2 & s2) const {//符号重载 
        if(name==s2.name)
            return age<s2.age;
        return name<s2.name;        
    }
}; 
int main(){
    //结构体数组排序一  加入cmp函数,
    student s[100];
    sort(s,s+3,cmp);//左闭右开,[0,3)的定义域
 
    //结构体数组排序二:符合重载 (不需要cmp函数)
    student2 s2[100]; 
    sort(s2,s2+3);//左闭右开, [0,2)
 
    return 0;
}

【入门】遥控飞机争夺赛

题目描述

红太阳杯遥控飞机大赛拉开帷幕。比赛规则为,每位选手让自己的飞机从起点到终点飞行5次,组委会记录5次的飞行的成绩之后去掉一个最大成绩、一个最小成绩后计算剩余3个成绩的平值(平均分保留3位小数)作为该选手的最终成绩。
有n名选手参加了比赛,从键盘读入每位选手的编号以及他们的5次飞行的成绩。
请根据n名选手的比赛成绩,编程计算出冠军、亚军、季军的编号以及组委会计算出的成绩。(存在多名选手成绩正好一样,原先在前面的选择先输出)(4.1.51)

输入

第一行为一个整数n,代表参加比赛的选手数量(n>=4 && n<=100)
后面的n行,每行有6个数,第一个数是选手的编号,后5个数为选手的5次飞行的成绩

输出

3行,第一行输出冠军的编号及飞行成绩(保留3位小数)用空格隔开2个数;第二行输出亚军的编号及飞行成绩,第三行输出季军的编号及飞行成绩

样例输入 
4
11 58 59 60 61 62
18 59 60 61 62 63
23 65 64 63 62 62 
10 60 61 61 65 62
样例输出 
23 63.000
10 61.333
18 61.000
来源/分类

二维数组 容器 结构体

#include<iostream>
#include<iomanip>
#include<queue>
using namespace std;
struct player {
	int num;
	double t_score;
	bool operator <(const player &a)const {
		return t_score<a.t_score;
	}
} p[105];
priority_queue<player>q;
int main() {
	int n;
	cin>>n;
	for(int i=1; i<=n; i++) {
		cin>>p[i].num;      //记录编号
		int sum=0;
		int max_=0,min_=100;        // 最高分、最低分
		for(int j=1; j<=5; j++) {
			int temp;
			cin>>temp;
			sum+=temp;                //5个分数累加
			if(max_<temp) {
				max_=temp;
			}    //找到最高分
			if(min_>temp) {
				min_=temp;
			}    //找到最低分
		}
		p[i].t_score=(sum-max_-min_)/3.0; //记录最终得分
		q.push(p[i]);    //把选手结点放入优先队列,自动按照t_score降序排列
	}
	for(int i=0; i<3; i++) {
		player p_temp;
		p_temp = q.top();
		q.pop();
		cout<<p_temp.num<<" "<<fixed<<setprecision(3)<<p_temp.t_score<<endl;
	}
	return 0;
}

【入门】求最大梯形的面积

题目描述

从键盘读入n(3<=n<=100)个梯形的上底、下底和高,请问这n个梯形中,最大面积的梯形的面积是多少?(梯形面积的求解公式为 S = (a + b) * h / 2,也就是(上底 + 下底) * 高 / 2)

输入
第1行为1个整数n,接下来n行每行3个整数分别代表梯形的上底、下底和高。
输出
最大面积梯形的面积(结果保留1位小数)
样例输入 
3
1 2 3
3 4 5
2 3 4
样例输出 
17.5
来源/分类
 
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
struct node{
    int a,b,h;//上底  下底  高
    double s;
//  bool operator < (const node &temp)const{
//      return s<temp.s;
//  } 
}area[110];
bool cmp(node a,node b){
    return a.s<b.s;
}
int main(){
    int n;
    cin >> n;
    for(int i=0;i<n;i++){
        cin>>area[i].a>>area[i].b>>area[i].h;
        area[i].s=(area[i].a+area[i].b)*area[i].h/2.0;
    }
//  sort(area,area+n);
    sort(area,area+n,cmp);
    cout<<fixed<<setprecision(1)<<area[n-1].s<<endl;
    return 0;
}

【入门】等比例缩放照片

题目描述

如图所示的一张照片(图①),可以把它的宽度或者高度减小从而减少照片的尺寸(如图②、③、④)。但只有等比例缩放的情况下照片才是最好看的,如图④;图②照片被压扁,图③照片被拉长。

图片不重要,不影响做题。

给定图片的原始尺寸以及n组要压缩的尺寸,请问哪组压缩后的数据的宽高比最接近原始数据?如果有多组压缩尺寸的宽高比都是一样的且都是最接近原始数据的,那么输出压缩后面积最小的那组数据。

输入

第1行,2个整数x和y,代表图片的原始尺寸的宽和高

第2行,一个整数n,代表接下来有n组压缩后的尺寸(n<=100)

接下来n行,每行2个数,代表n组压缩后的宽和高(确保输入的宽 >= 高)(本题所有照片的宽高均在1~10000之间)

输出

宽高比和原始图片最接近的宽高数据,如果有多组这样的数,输出面积最小的那组(不存在多组宽高比和原始数据一样接近且面积又一样的数据)

样例输入 
10 4
4
20 4
60 10
15 9
10 6
样例输出 
10 6
来源/分类
 
#include<bits/stdc++.h>
using namespace std;
struct node {
    int w,h;//宽  高
    int s;//面积
    double temp;//与标准比例差距
    bool operator < (const node &cmp)const {
        if(temp==cmp.temp)
            return s<cmp.s;
        else return temp<cmp.temp;
    }
} a[110];
int main() {
    int x,y;//原始尺寸
    cin>>x>>y;
    double ans=x*1.0/y;
    int n;
    cin>>n;
    for(int i = 0; i < n; i++) {
        cin>>a[i].w>>a[i].h;
        a[i].s=a[i].w*a[i].h;
        a[i].temp=fabs(1.0*a[i].w/a[i].h-ans);
    }
    sort(a,a+n);
    cout<<a[0].w<<" "<<a[0].h<<endl;
    return 0;
}

【基础】游览动物园

题目描述

动物园有很多游览区,小红已经在动物园的一个游览区游览,突然接到电话,要半个小时内到动物园外面跟一个朋友见面。半个小时小红只够游览完当前区域之后,游览一个最近的景区。已知从一个游览区域只能沿着地图(地图的长宽均小于100)中的直线走(上下左右四个方向),请问离小红当前游览区的最近的一个游览区的坐标是多少,如果有多个点离小红的位置都很近,请输出离出口最近的那个点的坐标(不存在多个点距离出口一样近)?

例如:假设小红在孔雀区(3,2),离小红最近的2处游览区分别是猴山(2,0)和虎山(5,3),但猴山离入口更近,因此输出猴山的坐标。

输入

第一行2个变量,为小红所在的游览区的坐标

第二行一个整数n,为该动物园内游览区的数量(n<=100)

接下来的n行,每行2个数,代表动物园的n个游览区的坐标(本题所有的坐标值都在1~1000的范围内)

输出
离小红最近的游览区的坐标
样例输入 
3 2
5
2 0 
5 3
3 2
5 5
3 8
样例输出 
2 0
#include<bits/stdc++.h>
using namespace std;
struct node {
    int x,y; //每个点的坐标
    int s; //每个点与初始坐标的距离
    int e; //每个点与入口的距离
} m[150];
bool cmp(node a,node b) {
    if(a.s==b.s)
        return a.e<b.e;  //特殊情况,如果距离想等,则判断距离入口的距离。
    else return a.s<b.s;
}
int main() {
    int xx,yy,n;
    cin>>xx>>yy>>n; //输出初始坐标和组数
    for(int i=0; i<n; i++) {
        cin>>m[i].x>>m[i].y;
        m[i].s=abs(m[i].x-xx)+abs(m[i].y-yy);
        m[i].e=abs(m[i].y)+abs(m[i].x);
    }
    sort(m,m+n,cmp); //排序
    if(m[0].s==0)
        cout<<m[1].x<<" "<<m[1].y;  //输出第二小的。(因为第一小的一定是本身)
    else cout<<m[0].x<<" "<<m[0].y;
    return 0;
}

【基础】活动选择

题目描述

学校在最近几天有n(n<=100)个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。

现在给出n个活动使用礼堂的起始时间begini和结束时间endi(begini < endi),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。请问最多可以安排多少活动?

请注意,开始时间和结束时间均指的是某个小时的0分0秒,如:3 5,指的是3:00~5:00,因此3 5和5 9这两个时间段不算冲突的时间段。

输入

第一行一个整数n(n<=100)

接下来的n行,每行两个整数,第一个begini,第二个是endi(begini< endi  <=32767)

输出
输出最多能安排的活动数
样例输入 复制
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
样例输出 复制
4
来源/分类
 
//将结束的时间排序(优先选择结束时间早的),然后遍历一遍,判断是否会重复
#include <iostream>
#include <algorithm>
using namespace std;
struct huodong
{
    int s;int e;
};
bool cmp(huodong a,huodong b)
{
    return a.e<b.e;
} //按结束时间从早到晚排序
int main()
{
    int n;while(cin>>n)
    {
        huodong huo[1000];
        for(int i=0;i<n;i++)
           cin>>huo[i].s>>huo[i].e;
        sort(huo,huo+n,cmp);
        int sum=1;
        int te=huo[0].e; //当前活动结束时间 
        for(int i=1;i<n;i++)
        {
            if(huo[i].s>=te) //可被排入
            {
                sum++;
                te=huo[i].e;
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}

【基础】期末考试成绩排名

题目描述

期末考试结束了,数学成绩已经出来,数学老师请你帮忙编写一个程序,可以帮助老师对班级所有同学的考试分数按照由高到低进行排序,并输出按照成绩排序后每个同学的学号、姓名、数学成绩。

输入

第一行是一个整数n(n<=100),代表班级的总人数
接下来n行,每行有3个数据,第一个数据是某个同学的学号,第二个数据是该同学的姓名的拼音(拼音不含空格),第三个数据是该同学的数学成绩(成绩是整数)

输出

按照数学成绩由高到低输出每个同学的学号、姓名、数学成绩,每行含1个同学的3个数据,3个数据用空格隔开。(如果出现多个同学数学成绩相同,则按照学号由小到大输出,不存在多个同学学号相同的情况)

样例输入 
3
1 zhangfang 98
2 liming 100
3 sunhua 99
样例输出 
2 liming 100
3 sunhua 99
1 zhangfang 98
来源/分类

容器 结构体

#include<bits/stdc++.h>
using namespace std;
struct node {
    string name;
    int grade;
    int id;
} a[110];
bool cmp(node a,node b) {
    if(a.grade!=b.grade) {
        return a.grade>b.grade;
    } else {
        //成绩相同按照学号从小到大
        return a.id<b.id;
    }
}
int main() {
    int n;
    cin>>n;
    for(int i=0; i<n; i++) {
        cin>>a[i].id>>a[i].name>>a[i].grade;
    }
    sort(a,a+n,cmp);
    for(int i=0; i<n; i++) {
        cout<<a[i].id<<' '<<a[i].name<<' '<<a[i].grade<<endl;
    }
    return 0;
}

【入门】宇宙总统2

题目描述

地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在投票已经结束,获得选票最多的人将荣登总统的宝座,如果有多个候选人获得票数一致,那么名字字典码最大的人将获得总统的宝座。请你编程计算出谁能够胜任总统的职位。
比如,有10个人参加了投票,这10张选票结果分别是。
zhangguoqiang
liming
wangfang
zhangguoqiang
wangfang
zhangguoqiang
zhaofei
zhaofei
wangfang
zhaofei
统计结果zhangguoqiang、wangfang、zhaofei三人每人都是3票,由于zhaofei名字的字典码最大,zhaofei当选为本届宇宙总统。

输入

第1行是一个整数n,代表投票的总数。(n<=1000)
第2行~第n+1行,每行是一个得到选票的人的名字(名字一定是小写的拼音,没有空格,长度小于1000)。 

输出

输出n行,按照每个人的得票数由高到低的顺序输出每个人的名字和得票数,中间用空格隔开。(如果有多个人得票数一致,则名字字典码大的人排在前面)

样例输入 
10
liming
wangfang
zhangguoqiang
zhangguoqiang
wangfang
zhangguoqiang
zhaofei
zhaofei
wangfang
zhaofei
样例输出 
zhaofei 3
zhangguoqiang 3
wangfang 3
liming 1
来源/分类

容器 结构体 map

#include<bits/stdc++.h>
using namespace std;
struct n {
    string s;
    int sum;
};
n a[1010];
map<string,int>f;
bool cmp(n x,n y) {
    if(x.sum!=y.sum) return x.sum>y.sum;
    else return x.s>y.s;
}
int n;
int main() {
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>a[i].s;
        f[a[i].s]++;
        a[i].sum=f[a[i].s];
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1; i<=n; i++) {
        if(f[a[i].s]) {
            cout<<a[i].s<<" "<<a[i].sum<<endl;
            f[a[i].s]=0;
        }
 
    }
    return 0;
}

【入门】购买贺年卡

题目描述

新年快到了,笑笑打算给他的好朋友们发贺年卡,而且他已经选好了自己要购买的贺卡的样式。俗话说得好,货比三家,笑笑来到商店,看了各个商铺这种贺卡的价钱。不仅如此,笑笑还记住了每个商铺的存货量。已知笑笑打算购买m张贺卡,问他最少花多少钱。

输入
第一行两个整数m和n。其中m表示要购买的贺卡的数量,n 表示商铺的个数。
以下n行,每行两个整数,分别表示该商铺这种贺卡的单价和存货量。
输出

仅一个数,表示笑笑花的最少钱数。

样例输入 
10 4
4 3
6 2
8 10
3 6
样例输出 
36
提示

数据规模:0<m,n<=1000,每个商铺贺卡单价在1~100之间,数量在1~1000之间,输入保证商铺的总存货量不少于m。

来源/分类
#include <bits/stdc++.h>
using namespace std;
struct card {
    int a,b;//单价  存货 
}a[1010];
bool cmp(card x,card y) {
    return x.a<y.a;
}
int main(void) {
    int m,n,sum=0;
    cin>>m>>n;
    for(int i=0; i<n; i++)
        cin>>a[i].a>>a[i].b;
    sort(a,a+n,cmp);//贪心 
    for(int i=0;i<n;i++)
        if(m>=a[i].b) {
            sum+=a[i].a*a[i].b;//数量不够,全买后继续采购下一家商店 
            m-=a[i].b;
        } else{
            sum+=a[i].a*m;//刚好够数量 
            break;
        } 
    cout<<sum<<endl;
    return 0;
}

【基础】新生舞会

题目描述

新生舞会开始了。n名新生每人有三个属性:姓名、学号、性别。其中,姓名用长度不超过20的仅由大小写字母构成的字符串表示,学号用长度不超过10的 仅由数字构成的字符串表示,性别用一个大写字符‘F’或‘M’表示。任意两人的姓名、学号均互不相同。换言之,每个人可被其姓名或学号唯一确定。

给出m对两人的信息(姓名或学号),判断他们是否能共舞。两人能共舞的充要条件为两人性别相异。

输入

第一行一个整数n(2<=n<=1000),表示学生人数。接下来的n行每行依次包含一名新生的姓名、学号、性别,分别用一个空格隔开。

之后的一行是一个整数m(1<=m<=1000),表示询问的数目。接着的m行每行包含两个信息(姓名或学号),保证两个信息不属于同一人,中间用一个空格隔开。

输出

对于每个询问输出一行,如果两人可以共舞,输出一个大写字母‘Y’,否则输出一个大写字母‘N’。

样例输入 
4
John 10 M
Jack 11 M
Kate 20 F
Jim 21 M
3
John 11
20 Jack
Jim Jack
样例输出 
N
Y
N
提示

【来源】蓝桥杯算法训练

来源/分类

蓝桥杯 结构体

#include<bits/stdc++.h>
using namespace std;
struct student {
    char name[21];
    char num[21];
    char sex;
}s[1000];
int main() {
    int n, m;
    char n1[21],n2[21];//姓名 或  学号 
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>s[i].name>>s[i].num>>s[i].sex;
    cin>>m;
    for(int i=0; i<m; i++) {
        int t1,t2;
        t1=-1,t2=-1;
        cin>>n1>>n2;
        for(int j=0; j<n; j++) {
            if(!strcmp(s[j].name,n1)||!strcmp(s[j].num,n1)) {           //char型数组比较,采用c++库函数strcmp
                t1=j;
                continue;
            }
            if(!strcmp(s[j].name,n2)||!strcmp(s[j].num,n2)) {
                t2=j;
                continue;
            }
        }
        if(s[t1].sex!=s[t2].sex)
            cout<<"Y"<<endl;
        else
            cout<<"N"<<endl;
    }
    return 0;
}

 

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵩韵儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值