PATA 打卡记录 排序

ACwing 打卡记录

第四章 排序

1.PATA 1012 最佳排名

#include<bits/stdc++.h>
using namespace std;
const int N=2020;
int flag;
struct stu{
    string id;
    int c_score,m_score,e_score,a_score;
    int c_rank,m_rank,e_rank,a_rank;
};
stu s[N];
bool cmp_c(stu a,stu b){
    if(a.c_score!=b.c_score) return a.c_score>b.c_score;
    else return a.id<b.id;
}
bool cmp_m(stu a,stu b){
    if(a.m_score!=b.m_score) return a.m_score>b.m_score;
    else return a.id<b.id;
}
bool cmp_e(stu a,stu b){
    if(a.e_score!=b.e_score) return a.e_score>b.e_score;
    else return a.id<b.id;
}
bool cmp_a(stu a,stu b){
    if(a.a_score!=b.a_score) return a.a_score>b.a_score;
    else return a.id<b.id;
}
void print(stu a){
    if(a.a_rank<=a.c_rank&&a.a_rank<=a.m_rank&&a.a_rank<=a.e_rank){
        printf("%d A\n",a.a_rank);
    }else if(a.c_rank<=a.m_rank&&a.c_rank<=a.e_rank&&a.c_rank<a.a_rank){
        printf("%d C\n",a.c_rank);
    }else if(a.m_rank<a.a_rank&&a.m_rank<a.c_rank&&a.m_rank<=a.e_rank){
        printf("%d M\n",a.m_rank);
    }else{
        printf("%d E\n",a.e_rank);
    }
}
int main(){
    int m,n;
    cin>>m>>n;
    for(int i=0;i<m;i++){
        cin>>s[i].id>>s[i].c_score>>s[i].m_score>>s[i].e_score;
        s[i].a_score=round((s[i].c_score+s[i].m_score+s[i].e_score)*1.0/3);
    }
    sort(s,s+n,cmp_c);
    s[0].c_rank=1;
    for(int i=1;i<m;i++){
        if(s[i-1].c_score==s[i].c_score) s[i].c_rank=s[i-1].c_rank;
        else s[i].c_rank=i+1;
    }
    sort(s,s+n,cmp_m);
    s[0].m_rank=1;
    for(int i=1;i<m;i++){
        if(s[i-1].m_score==s[i].m_score) s[i].m_rank=s[i-1].m_rank;
        else s[i].m_rank=i+1;
    }
    sort(s,s+n,cmp_e);
    s[0].e_rank=1;
    for(int i=1;i<m;i++){
        if(s[i-1].e_score==s[i].e_score) s[i].e_rank=s[i-1].e_rank;
        else s[i].e_rank=i+1;
    }
    sort(s,s+n,cmp_a);
    s[0].a_rank=1;
    for(int i=1;i<m;i++){
        if(s[i-1].a_score==s[i].a_score) s[i].a_rank=s[i-1].a_rank;
        else s[i].a_rank=i+1;
    }
    for(int i=0;i<n;i++){
        string q;
        cin>>q;
        for(int i=0;i<m;i++){
            flag=0;
        if(s[i].id==q){
            print(s[i]);
            flag=1;
            break;
        }
        }
        if(flag==0) printf("N/A\n");
    }
    return 0;
}

2. 1012 数字图书馆

#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>

using namespace std;

struct Book
{
    string id, name, author;
    set<string> keywords;
    string publisher, year;
};

int main()
{
    int n, m;
    cin >> n;

    vector<Book> books;
    while (n -- )
    {
        string id, name, author;
        cin >> id;
        getchar();
        getline(cin, name), getline(cin, author);
        string line;
        getline(cin, line);
        stringstream ssin(line);
        string keyword;
        set<string> keywords;
        while (ssin >> keyword) keywords.insert(keyword);
        string publisher, year;
        getline(cin, publisher);
        cin >> year;
        books.push_back({id, name, author, keywords, publisher, year});
    }

    cin >> m;
    getchar();
    string line;
    while (m -- )
    {
        getline(cin, line);
        cout << line << endl;
        string info = line.substr(3);
        char t = line[0];
        vector<string> res;
        if (t == '1')
        {
            for (auto& book : books)
                if (book.name == info)
                    res.push_back(book.id);
        }
        else if (t == '2')
        {
            for (auto& book : books)
                if (book.author == info)
                    res.push_back(book.id);
        }
        else if (t == '3')
        {
            for (auto& book : books)
                if (book.keywords.count(info))
                    res.push_back(book.id);
        }
        else if (t == '4')
        {
            for (auto& book : books)
                if (book.publisher == info)
                    res.push_back(book.id);
        }
        else
        {
            for (auto& book : books)
                if (book.year == info)
                    res.push_back(book.id);
        }

        if (res.empty()) puts("Not Found");
        else
        {
            sort(res.begin(), res.end());
            for (auto id : res) cout << id << endl;
        }
    }

    return 0;
}

3.PATA 1025 PAT排名

#include<bits/stdc++.h>
using namespace std;
//输入、输出比较繁琐,cin cout会超时
const int N=1e5+10;
int cnt;
struct stu{
    int area;
    char num[20];
    int score;
    int rank;
    int f_rank;
};
struct stu s[N];
bool cmp1(struct stu a,struct stu b){
    if(a.score!=b.score) return a.score>b.score;
    else return strcmp(a.num,b.num)<0;
}
int main(){
    int n;
    scanf("%d",&n);
    int l=0;
    for(int i=0;i<n;i++){
        int t;
        cin>>t;
        cnt+=t;
    for(int j=l;j<cnt;j++){
        cin>>s[j].num>>s[j].score;
        s[j].area=i+1;
    }
    sort(s+l,s+cnt,cmp1);//对本考场的考生进行排序
    s[l].rank=1;
    for(int k=l;k<cnt;k++)
    for(int i=l+1;i<cnt;i++){
        if(s[i].score==s[i-1].score){
            s[i].rank=s[i-1].rank;
        }else{
            s[i].rank=i+1-l;
        }
    }//计算在本考场内的排名 
    l=cnt;
    }
    sort(s,s+cnt,cmp1);
    s[0].f_rank=1;
    for(int i=1;i<cnt;i++){
        if(s[i].score==s[i-1].score){
            s[i].f_rank=s[i-1].f_rank;
        }else{
            s[i].f_rank=i+1;
        }
    }
    printf("%d\n",cnt);
    for(int i=0;i<cnt;i++){
        printf("%s %d %d %d\n",s[i].num,s[i].f_rank,s[i].area,s[i].rank);
    }
    return 0;
}

4.PATA 1028 列表排序

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct stu{
	char num[20];
	char name[20];
	int score;
};
bool cmp1(stu a,stu b){
    int s=strcmp(a.num,b.num);
	return s<0;
}
bool cmp2(stu a,stu b){
	int s=strcmp(a.name,b.name);
    int s2=strcmp(a.num,b.num);
	if(s!=0){
		return s<0;
	}else{
		return s2<0;
	}
}
bool cmp3(stu a,stu b){
	if(a.score!=b.score){
		return a.score<b.score;
	}else{
        int s=strcmp(a.num,b.num);
		return s<0;
	}
}
struct stu s[N];
int main(){
	int n,c;
	cin>>n>>c;
	for(int i=0;i<n;i++){
		cin>>s[i].num>>s[i].name>>s[i].score;
	}
	if(c==1){
		sort(s,s+n,cmp1);
	}else if(c==2){
		sort(s,s+n,cmp2);
	}else{
		sort(s,s+n,cmp3);
	}
	for(int i=0;i<n;i++){
		printf("%s %s %d\n",s[i].num,s[i].name,s[i].score);
	} 
	return 0;
}

5.PATA 1039 学生课程列表

#include<bits/stdc++.h>
using namespace std;
const int N=40010;
const int M=26*26*26*10+1;
vector<int>selectcourse[M];
int getid(char name[]){
	int id=0;
	for(int i=0;i<3;i++){
		id=id*26+(name[i]-'A');
	}
	id=id*10+(name[3]-'0');
	return id;
}
int main(){
	char name[5];
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i=0;i<k;i++){
		int course,x;
		scanf("%d%d",&course,&x);
		for(int j=0;j<x;j++){
			scanf("%s",name);
			int id=getid(name);
			selectcourse[id].push_back(course);
		}
	}
	for(int i=0;i<n;i++){
		scanf("%s",name);
		int id=getid(name);
		sort(selectcourse[id].begin(),selectcourse[id].end());
		printf("%s %d",name,selectcourse[id].size());
		for(int j=0;j<selectcourse[id].size();j++){
			printf(" %d",selectcourse[id][j]);
		}
		printf("\n");
	}
	return 0;
}

6.PATA 1052 链表排序

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int cnt;
struct Node{
    int address,data,next;
    bool flag;
};
Node node[N];
bool cmp(Node a,Node b){
    if(a.flag==0||b.flag==0) return a.flag>b.flag;
    else return a.data<b.data;
}
int main(){
    int n,begin;
    for(int i=0;i<N;i++)
    node[i].flag=0;
    cin>>n>>begin;
    while(n--){
        int address,data,next;
        cin>>address>>data>>next;
        node[address].address=address;
        node[address].data=data;
        node[address].next=next;
    }
    int p=begin;
    while(p!=-1){
        node[p].flag=1;
        cnt++;
        p=node[p].next;
    }
    sort(node,node+N,cmp);
    if(cnt==0){
        printf("0 -1");
    }else{
        printf("%d %05d\n",cnt,node[0].address);
        for(int i=0;i<cnt;i++){
            if(i!=cnt-1){
                printf("%05d %d %05d\n",node[i].address,node[i].data,node[i+1].address);
            }else{
                printf("%05d %d -1",node[i].address,node[i].data);
            }
        }
    }
    return 0;
}

7.1098 插入还是堆排序

#include<bits/stdc++.h>
using namespace std;
const int N=110;
int flag;
int a[N],b[N];
void down(int u, int size)
{
    int t = u;
    if (u * 2 <= size && b[t] < b[u * 2]) t = u * 2;
    if (u * 2 + 1 <= size && b[t] < b[u * 2 + 1]) t = u * 2 + 1;
    if (t != u)
    {
        swap(b[t], b[u]);
        down(t, size);
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    int k=1;
    while(k<=n&&b[k]>=b[k-1]) k++;
    int t=k;
    for(t=k;t<=n;t++){
        if(b[t]!=a[t]){
            flag=1;
        }
    }
    if(flag==1){
        printf("Heap Sort\n");
        int p=n;
        while (b[1] <= b[p]) p -- ;
        swap(b[1], b[p]);
        down(1, p - 1);
    }else{
        printf("Insertion Sort\n");
        sort(b,b+k+1);
    }
    printf("%d",b[1]);
    for(int i=2;i<=n;i++){
        printf(" %d",b[i]);
    }
    return 0;
}

8.PATA 1089 插入还是归并

#include<bits/stdc++.h>
using namespace std;
const int N=110;
int flag;
int a[N],b[N];
int n;
bool check(){
    for(int i=1;i<=n;i++){
        if(a[i]!=b[i]) return false;
    }
    return true;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    int k=1;
    while(k<=n&&b[k]>=b[k-1]) k++;
    int t=k;
    for(t=k;t<=n;t++){
        if(b[t]!=a[t]){
            flag=1;
        }
    }
    if(flag==1){
        printf("Merge Sort\n");
        int k=1;
        while(1){
            bool flag=check();
            int len=1<<k;
            for(int i=1;i<=n;i+=len){
                sort(a+i,a+min(n+1,i+len));
            }
            if(flag) break;
            k++;
        }
        printf("%d",a[1]);
        for(int i=2;i<=n;i++)
        printf(" %d",a[i]);
    }else{
        printf("Insertion Sort\n");
        sort(b,b+k+1);
        printf("%d",b[1]);
        for(int i=2;i<=n;i++){
            printf(" %d",b[i]);
    }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值