PAT备考day4+5 排序

排序关键:能sort则sort,如果要模拟别的排序也可以用sort

结构体的使用,vector的使用都挺重要的

打卡记录 :

笔记:

排序

  • 快速排序

  • 归并排序

  • 堆排序

以上时间复杂度均为nlogn

难度主要在于模拟,细节多

字符串(名字)对应排名——可以用哈希表

unordered_map<string,int>

直接将成绩排序,然后通过二分来寻找某同学成绩的位置

round():四舍五入函数

#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <vector>

using namespace std;

unordered_map<string,vector<int>> grades;
vector<int>q[4];

int get_rank(vecotr<int>&a,int x){
  int l=0,r=a.size()-1;
  while(l<r){
    int mid=l+r+1>>1;
    if(a[mid]<=x)l=mid;
    else r=mid-1;
  }
  return l;
}

int main(){
  int n,m;
  cin>>n>>m;
  
  for(int i=0;i<n;i++){
    string id;
    int t[4]={0};
    for(int i=1;i<4;i++){
      cin>>t[i];
      t[0]+=t[i];
    }
    t[0]=round(t[0]/3.0);
    for(int j=0;j<4;j++){
      q[j].push_back(t[j]);
      grades[id].push_back(t[j]);
    }
  }
  
  for(int i=0;i<4;i++)sort(q[i].begin(),q[i].end());//注意sort函数的用法
  char names[]="ACME";
  while(m--){
    string id;
    cin>>id;
    if(grades.count(id)==0)puts("N/A");
    else{
      int res=n+1;
      char c;
      for(int i=0;i<4;i++){
        int rank=get_rank(q[i],grades[id][i]);
        if(rank<res){
          res=rank;
          c=names[i];
        }
      }
      cout<<res<<' '<<c<<endl;
    }
  }
  return 0;
}

当想用getline的时候需要事先getchar将上一行的回车读掉

substr(string, start<,length>):从string的start位置开始提取字符串,length可以不写;substr中的start为负数时返回空值; 当length为负数时,默认从start位罝取所有字符。

string info=line.substr(3);
抽取指定数目的字符:

var str="Hello world!";
var n=str.substr(2,3)

*n* 输出结果:

llo

计算排名的时候可以:

  1. 通过二分来找到分数的位置

  2. for来进行循环

    1. 和上一个不同分数,i+1

    2. 和上一个同分数,那就和上一个的排名一样

      for(int i=0;i<g.size();i++){
                  if(!i || g[i].grade!=g[i-1].grade)g[i].loc_rank=i+1;
                  else g[i].loc_rank=g[i-1].loc_rank;
              }

实现sort从大到小

#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b){
        return a>b;
};
main(){
  //sort函数第三个参数自己定义,实现从大到小
  int a[]={45,12,34,77,90,11,2,4,5,55};
  sort(a,a+10,cmp);
  for(int i=0;i<10;i++)
    cout<<a[i]<<" ";
}
//自定义函数
bool cmp(int a,int b){
  return a>b;
}



 sort(arr, arr + 5, greater<int>());

当输入输出的规模≥105时,不要用cin、cout容易超时,全部换成scanf,printf

可以在结构体中构建初始化函数

students[u_id]=Student(id)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值