NOI题解(1.10编程基础之简单排序)

来源:互联网 发布:java 数组转字符串 编辑:程序博客网 时间:2024/06/05 00:11

涉及的知识点:

vector容器存储结构体变量

sort自定义排序

稳定排序:冒泡排序

不稳定排序:algorithm中的sort函数,为不稳定排序

题目地址:http://noi.openjudge.cn/ch0110/


01:谁考了第k名

#include <iostream>#include <vector>#include <algorithm>struct stu{int num;float grade;};bool compare(const stu* st1,const stu* st2){return st1->grade>st2->grade;}int main(){int n,k;std::cin>>n>>k;std::vector<stu*> v;for(int i=0;i<n;i++){stu *student = new stu();int num;float grade;std::cin>>num>>grade;student->num = num;student->grade = grade;v.push_back(student);}sort(v.begin(),v.end(),compare);// for(std::vector<stu*>::iterator it=v.begin();it!=v.end();it++)// {// std::cout<<(*it)->num<<" "<<(*it)->grade<<std::endl; // }std::cout<<(*v[k-1]).num<<" "<<(*v[k-1]).grade<<std::endl;// std::cout<<v[k-1]->num<<" "<<v[k-1]->grade<<std::endl;//这两种访问方式都可以return 0;}

02:奇数单增序列

#include <iostream>#include <vector>#include <algorithm>int main(){int n;std::cin>>n;std::vector<int>vc;while(n--){int num;std::cin>>num;if(num%2!=0)vc.push_back(num);}sort(vc.begin(),vc.end());bool firstF = true;for(int i=0;i<vc.size();i++){if(firstF){std::cout<<vc[i];firstF = false;}else{std::cout<<","<<vc[i];}}return 0;}

03:成绩排序

#include <iostream>#include <vector>#include <algorithm>#include <string>struct  stu{std::string name;int grade;};//const表示引用变量不会在函数中被改变bool compare(const stu& st1,const stu& st2){if(st1.grade>st2.grade)return 1;else if(st1.grade==st2.grade&&st1.name<st2.name)return 1;elsereturn 0;}int main(){int n;std::cin>>n;std::vector<stu>vc;while(n--){std::string str;std::cin>>str;int grade;std::cin>>grade;stu student;student.name = str;student.grade = grade;vc.push_back(student);}sort(vc.begin(),vc.end(),compare);for(int i=0;i<vc.size();i++){std::cout<<vc[i].name<<" "<<vc[i].grade<<std::endl;}return 0;}

04:奖学金

#include <iostream>#include <vector>#include <algorithm>#include <string>struct  stu{int num;int chinese;int math;int english;int sum;};//const表示引用变量不会在函数中被改变bool compare(const stu& st1,const stu& st2){if(st1.sum>st2.sum)return 1;else if(st1.sum == st2.sum && st1.chinese > st2.chinese)return 1;else if(st1.sum == st2.sum && st1.chinese == st2.chinese && st1.num<st2.num)return 1;elsereturn 0;}int main(){int n;std::cin>>n;std::vector<stu>vc;int num=0;while(n--){num++;int chinese,math,english;std::cin>>chinese>>math>>english;stu student;student.num = num;student.chinese = chinese;student.math = math;student.english = english;student.sum = chinese+math+english;vc.push_back(student);}sort(vc.begin(),vc.end(),compare);for(int i=0;i<5;i++){std::cout<<vc[i].num<<" "<<vc[i].sum<<std::endl;}return 0;}

05:分数线划定

#include <iostream>#include <vector>#include <algorithm>#include <string>#include <math.h>struct  stu{int num;int score;};//const表示引用变量不会在函数中被改变bool compare(const stu& st1,const stu& st2){if(st1.score>st2.score)return 1;else if(st1.score==st2.score&&st1.num<st2.num)return 1;elsereturn 0;}int main(){int n, legalN;std::cin>>n>>legalN;legalN = floor((double)legalN*1.5);std::vector<stu>vc;while(n--){int num,score;std::cin>>num>>score;stu student;student.num = num;student.score = score;vc.push_back(student);}sort(vc.begin(),vc.end(),compare);int count = 0;for(int i=0;i<vc.size();i++){if(vc[i].score>=vc[legalN-1].score)count++;elsebreak;}std::cout<<vc[legalN-1].score<<" "<<count<<std::endl;for(int i=0;i<count;i++){std::cout<<vc[i].num<<" "<<vc[i].score<<std::endl;}return 0;}

06:整数奇偶排序

#include <iostream>#include <vector>#include <algorithm>//const表示引用变量不会在函数中被改变bool compare(const int &odd1,const int &odd2){return odd1>odd2;}int main(){std::vector<int> odd;std::vector<int> even;for(int i=0;i<10;i++){int num;std::cin>>num;if(num%2==0){even.push_back(num);}else{odd.push_back(num);}}sort(odd.begin(),odd.end(),compare);sort(even.begin(),even.end());for(int i=0;i<odd.size();i++){std::cout<<odd[i]<<" ";}for(int i=0;i<even.size();i++){std::cout<<even[i]<<" ";}return 0;}

07:合影效果

#include <iostream>#include <vector>#include <algorithm>#include <string.h>#include <math.h>#include <iomanip>struct  stu{std::string gender;double high;};bool compare1(const stu& st1,const stu& st2){return st1.high<st2.high;}//const表示引用变量不会在函数中被改变bool compare2(const stu& st1,const stu& st2){return st1.high>st2.high;}int main(){int n;std::cin>>n;std::vector<stu>vc;while(n--){std::string gender;std::cin>>gender;double high;std::cin>>high;stu student;student.gender = gender;student.high = high;vc.push_back(student);}sort(vc.begin(),vc.end(),compare1);for(int i=0;i<vc.size();i++){if(!strcmp(vc[i].gender.data(),"male"))std::cout<<std::fixed<<std::setprecision(2)<<vc[i].high<<" ";}sort(vc.begin(),vc.end(),compare2);for(int i=0;i<vc.size();i++){if(!strcmp(vc[i].gender.data(),"female"))std::cout<<vc[i].high<<" ";}return 0;}


08:病人排队

#include <iostream>#include <vector>#include <algorithm>using namespace std;struct p{string id;int age;};/*冒泡排序是一种稳定的排序比较相邻两个元素,交换也只发生在这两个元素之间相等元素及时相邻比较也不会交换因此是稳定的排序方式*/void bubbleSort(vector<p> &pList){for(int i=0;i<pList.size()-1;i++){for(int j=0;j<pList.size()-1-i;j++){if(pList[j].age < pList[j+1].age){//swapp pT;pT = pList[j];pList[j] = pList[j+1];pList[j+1] = pT;}}}}int main(){int k;cin>>k;vector<p> old;vector<p> young;while(k--){p pTemp;string id;int age;cin>>id>>age;pTemp.age = age;pTemp.id = id;if(age>=60)old.push_back(pTemp);elseyoung.push_back(pTemp);}bubbleSort(old);for(int i=0;i<old.size();i++){cout<<old[i].id<<" "<<endl;}for(int i=0;i<young.size();i++){cout<<young[i].id<<" "<<endl;}return 0;}


09:明明的随机数

#include <iostream>#include <vector>#include <set>#include <algorithm>using namespace std;/*生成1-1000的随机数*/// int getRandom()// {// srand(static_cast<unsigned int>(time(0)));// return rand()%1000+1;// }int main(){set<int> m_set;vector<int> m_v;int N;cin>>N;while(N--){int num;cin>>num;if(m_set.count(num)==0){m_set.insert(num);m_v.push_back(num);}}sort(m_v.begin(),m_v.end());cout<<m_v.size()<<endl;for(int i=0;i<m_v.size();i++){cout<<m_v[i]<<" ";}return 0;}

#include <iostream>#include <vector>#include <set>#include <algorithm>using namespace std;/*生成1-1000的随机数*/// int getRandom()// {// srand(static_cast<unsigned int>(time(0)));// return rand()%1000+1;// }int main(){bool flag[1000]={0};vector<int> m_v;int N;cin>>N;while(N--){int num;cin>>num;if(flag[num]==false){flag[num] = true;m_v.push_back(num);}}sort(m_v.begin(),m_v.end());cout<<m_v.size()<<endl;for(int i=0;i<m_v.size();i++){cout<<m_v[i]<<" ";}return 0;}


10:单词排序

#include <iostream>#include <vector>#include <set>#include <algorithm>#include <string.h>using namespace std;void bubbleSort(vector<string> &sList){for(int i=0;i<sList.size()-1;i++){for(int j=0;j<sList.size()-1-i;j++){if(sList[j]>sList[j+1]){string sT;sT = sList[j];sList[j] = sList[j+1];sList[j+1] = sT;}}}}int main(){string str;vector<string> vc;set<string> m_set;while(cin>>str){vc.push_back(str);}bubbleSort(vc);for(int i=0;i<vc.size();i++){if(m_set.count(vc[i])){continue;}else{m_set.insert(vc[i]);cout<<vc[i]<<endl;}}return 0;}



阅读全文
0 0