排序关键:能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
计算排名的时候可以:
-
通过二分来找到分数的位置
-
for来进行循环
-
和上一个不同分数,i+1
-
和上一个同分数,那就和上一个的排名一样
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)