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;
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;
}