1036 Boys vs Girls (25 分)

本文对比了两个版本的C++代码,分析了不同实现方式在效率和代码简洁性上的差异。通过对排序和查找问题的处理,展示了如何在保持代码简洁的同时优化性能。

版本2

第二次做也不见得比第一次快很多。
而且我发现第一次的代码更简洁。

#include <cstdio>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <algorithm> 
#include <unordered_set>
#include <unordered_map>
#include <map>
using namespace std;
struct node{
	string name, id;
	int grade;
};
bool cmp(node a, node b){
	return a.grade > b.grade;
}
int main(){
	int n, grade;
	scanf("%d", &n);
	vector<node> boy, girl;
	string name, id;
	char C;
	for(int i = 0; i < n; i++){
		cin >> name>>C>>id>>grade;
		if(C == 'M'){
			boy.push_back({name, id, grade});
		}else if(C == 'F'){
			girl.push_back({name, id, grade});
		}
	}
	//highest 
	bool flag = false;
	if(girl.size() == 0){
		puts("Absent");
		flag = true;
	}else {
		sort(girl.begin(), girl.end(), cmp);	
		cout<<girl[0].name<<" "<<girl[0].id<<endl;
	}
	//lowest
	int bn = boy.size() - 1;
	if(boy.size() == 0){
		puts("Absent");
		flag = true;
	}else {
		sort(boy.begin(), boy.end(), cmp);	
		cout<<boy[bn].name<<" "<<boy[bn].id<<endl;
	}
	//difference
	if(flag){
		puts("NA");
	}else{
		cout<<girl[0].grade - boy[bn].grade <<endl;
	}
	return 0;
}

版本1

这种排序查找的题太多了
对于我现阶段来说并没有特别大的提升,但是为了提交AC时爽一下,我还是再刷了一遍。

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int main(){
	int n;
	cin>>n;
	string namef,idf,namem,idm,name,id;
	char sex;
	int grade,gradem=101,gradef=-1;
	for(int i=0;i<n;i++){
		cin>>name>>sex>>id>>grade;
		if(sex=='M'){
			if(grade < gradem){
				gradem = grade;
				namem = name;
				idm = id;
			}
		}else{
			if(grade > gradef){
				gradef = grade;
				namef = name;
				idf = id;
			}
		}
	}
	if(gradef==-1) cout<<"Absent"<<endl;
	else cout<<namef<<" "<<idf<<endl;
	if(gradem==101) cout<<"Absent"<<endl;
	else cout<<namem<<" "<<idm<<endl;
	if(gradef==-1 || gradem==101) cout<<"NA"<<endl;
	else cout<<gradef-gradem<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值