结构体排序
#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)
输入
输出
样例输入
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
#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张贺卡,问他最少花多少钱。
输入
以下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;
}