[PAT 乙级] 1095 解码PAT准考证 (25 分)——(STL)2021-08-14 内附几个测试点

二刷代码

其实和一开始的做法一模一样,这次把printf("NA\n");加上了,就AC了。
二刷就抱着试试看的心态,把第一次做的代码又写了一遍,已提交就AC了,根tm做梦一样

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
struct node{
    string id;
    int score;
}s[10010];
bool cmp(struct node a,struct node b){
    if(a.score==b.score) return a.id<b.id;
    else return a.score>b.score;
}
struct node1{
    string exid;
    int exnum;
    bool operator<(const node1 &t) const{
        if(exnum==t.exnum) return exid<t.exid;
        else return exnum>t.exnum;
    }
}tmp;
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++) cin>>s[i].id>>s[i].score;
    int cnt=1;
    for(int i=0;i<m;i++){
        int dem;
        string temp;
        cin>>dem>>temp;
        printf("Case %d: %d %s\n",cnt,dem,temp.c_str());
        cnt++;
        vector<struct node> v,v1;
        vector<struct node1> v2;
        map<string,int> mp;
        if(dem==1){
            for(int i=0;i<n;i++) if(s[i].id[0]==temp[0]) v.push_back(s[i]);
            sort(v.begin(),v.end(),cmp);
            if(v.size()==0) printf("NA\n");
            else{
                for(auto it=v.begin();it!=v.end();it++){
                    printf("%s %d\n",(*it).id.c_str(),(*it).score);
                }
            }
            
        }else if(dem==2){
            int sum=0,count=0;
            for(int i=0;i<n;i++) {
                if(s[i].id.substr(1,3)==temp) {
                    count++;
                    sum+=s[i].score;
                }
            }
            if(sum==0&&count==0) printf("NA\n");
            else printf("%d %d\n",count,sum);
        }else{
            for(int i=0;i<n;i++) {
                if(s[i].id.substr(4,6)==temp) mp[s[i].id.substr(1,3)]++;
            }
            for(auto it=mp.begin();it!=mp.end();it++){
                tmp.exid=it->first;
                tmp.exnum=it->second;
                v2.push_back(tmp);
            }
            sort(v2.begin(),v2.end());
            if(v2.size()==0) printf("NA\n");
            else {
                for(auto it=v2.begin();it!=v2.end();it++){
                    printf("%s %d\n",(*it).exid.c_str(),(*it).exnum);
                 } 
            }
        }
    }
    return 0;
}

在这里插入图片描述


在这里插入图片描述

柳神代码

题目大意:给出一组学生的准考证号和成绩,准考证号包含了等级(乙甲顶),考场号,日期,和个人编号信息,并有三种查询方式
查询一:给出考试等级,找出该等级的考生,按照成绩降序,准考证升序排序
查询二:给出考场号,统计该考场的考生数量和总得分
查询三:给出考试日期,查询改日期下所有考场的考试人数,按照人数降序,考场号升序排序

分析:先把所有考生的准考证和分数记录下来~
1.按照等级查询,枚举选取匹配的学生,然后排序即可
2.按照考场查询,枚举选取匹配的学生,然后计数、求和
3.按日期查询每个考场人数,用unordered_map存储,最后排序汇总~

注意:1.第三个用map存储会超时,用unordered_map就不会超时啦~
2.排序传参建议用引用传参,这样更快,虽然有时候不用引用传参也能通过,但还是尽量用,养成好习惯~

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
struct node {
    string t;
    int value;
};
bool cmp(const node &a, const node &b) {
    return a.value != b.value ? a.value > b.value : a.t < b.t;
}
int main() {
    int n, k, num;
    string s;
    cin >> n >> k;
    vector<node> v(n);
    for (int i = 0; i < n; i++)
        cin >> v[i].t >> v[i].value;
    for (int i = 1; i <= k; i++) {
        cin >> num >> s;
        printf("Case %d: %d %s\n", i, num, s.c_str());
        vector<node> ans;
        int cnt = 0, sum = 0;
        if (num == 1) {
            for (int j = 0; j < n; j++)
                if (v[j].t[0] == s[0]) ans.push_back(v[j]);
        } else if (num == 2) {
            for (int j = 0; j < n; j++) {
                if (v[j].t.substr(1, 3) == s) {
                    cnt++;
                    sum += v[j].value;
                }
            }
            if (cnt != 0) printf("%d %d\n", cnt, sum);
        } else if (num == 3) {
            unordered_map<string, int> m;
            for (int j = 0; j < n; j++)
                if (v[j].t.substr(4, 6) == s) m[v[j].t.substr(1, 3)]++;
            for (auto it : m) ans.push_back({it.first, it.second});
        }
        sort(ans.begin(), ans.end(),cmp);
        for (int j = 0; j < ans.size(); j++) printf("%s %d\n", ans[j].t.c_str(), ans[j].value);
        if (((num == 1 || num == 3) && ans.size() == 0) || (num == 2 && cnt == 0)) printf("NA\n");
    }
    return 0;
}

我的代码

只得了15分,草

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
int n,m;
struct node{
	string id;
	int score;
}s[105];
struct node1{
    string exam;
    int penum;
}s1[105];
bool cmp(struct node a,struct node b) {
    if(a.score==b.score) return a.id<b.id;
    return a.score>b.score;
}
bool cmp1(struct node1 a,struct node1 b) {
    if(a.penum==b.penum) return stoi(a.exam)<stoi(b.exam);
    return a.penum>b.penum;
}
void prtdeg(string temp,char dge){
    vector<struct node> v;
	for(int i=0;i<n;i++) if(s[i].id[0]==dge) v.push_back(s[i]);
    sort(v.begin(),v.end(),cmp);
    if(v.size()==0) printf("NA\n");
    else {
        for(auto it=v.begin();it!=v.end();it++) cout<<(*it).id<<" "<<(*it).score<<endl;
    }
}


void prtnum(string num){
    int cnt=0,sum=0;
	for(int i=0;i<n;i++) {
        if(s[i].id.substr(1,3)==num){
            cnt++;
            sum+=s[i].score;
        }
            
    }
    if(sum==0) printf("NA\n");
    else printf("%d %d\n",cnt,sum);
}



void prtexam(string temp){
    map<string,int> mp;
    for(int i=0;i<n;i++) if(s[i].id.substr(4,6)==temp) mp[s[i].id.substr(1,3)]++;
    int x=0;
    int msize=mp.size();
    for(auto it=mp.begin();it!=mp.end();it++){
        s1[x].exam=it->first;
        s1[x].penum=it->second;
        x++;
    }
    sort(s1,s1+msize,cmp1);
    if(msize==0) printf("NA\n");
    else {
        for(int c=0;c<msize;c++) cout<<s1[c].exam<<" "<<s1[c].penum<<endl;
        
    }
}
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++) cin>>s[i].id>>s[i].score;
	for(int i=0,count=1;i<m;i++,count++){
		int t;
		string temp;
		cin>>t>>temp;
		printf("Case %d: %d %s\n",count,t,temp.c_str());
		if(t==1){
            char dge=temp[0];
			prtdeg(temp,dge);
		}else if(t==2){
			prtnum(temp);
		}else{
			prtexam(temp);
		}
	}
	return 0;
} 

在这里插入图片描述

几个测试点:

1.

输入

30 10
T885191207687 84
B201180327929 74
T448161215938 20
B424160927440 36
B219150315014 88
B558191207189 0
T274190627209 100
A771180627867 25
T844150627374 34
A284171207710 38
A673171227639 28
T522190615989 66
B909191227976 11
T154170927975 0
A186181221954 21
B979161207017 4
A512160921636 44
A476170327361 21
T529170321235 38
B760150627850 5
B743160321720 61
T563150315924 1
B657161227420 63
B429150907106 44
T286150307610 63
A992170627060 99
T619160615759 91
T110160921759 56
T504170315206 7
B274150315749 96
3 181207
3 191215
2 290
1 A
3 180621
1 B
3 190621
2 425
2 769
3 180615

标准答案

Case 1: 3 181207
NA
Case 2: 3 191215
NA
Case 3: 2 290
NA
Case 4: 1 A
A992170627060 99
A512160921636 44
A284171207710 38
A673171227639 28
A771180627867 25
A186181221954 21
A476170327361 21
Case 5: 3 180621
NA
Case 6: 1 B
B274150315749 96
B219150315014 88
B201180327929 74
B657161227420 63
B743160321720 61
B429150907106 44
B424160927440 36
B909191227976 11
B760150627850 5
B979161207017 4
B558191207189 0
Case 7: 3 190621
NA
Case 8: 2 425
NA
Case 9: 2 769
NA
Case 10: 3 180615
NA

2

输入:

500 50
A391160921806 7
B224171221127 5
B144170907357 100
B167160627272 22
A637191227421 1
T138150607826 76
B127170621092 71
A997190327830 29
B630170921350 31
A169180907925 43
B324180607429 1
T322160615020 12
A386171207104 52
B613190621972 65
T147150921721 52
B738151207683 99
B604190621792 72
A908150315782 26
A782160321642 91
A365180921928 100
B402160915771 73
A276181227336 70
B964190907303 78
B997170307877 95
B742190921791 0
T462180327365 27
T556170321366 4
A492151215378 86
T910150321336 80
B358160315321 59
B226190927597 17
T922150327693 65
B760170915799 23
T442150607789 80
A352180327253 13
B811150321471 82
T271181227646 15
A409151207783 70
B598161221267 74
T945190921826 27
T404190315372 96
T287150907417 36
A852191215371 50
A162161221182 33
A815170615841 25
B117160927985 77
A699170321893 39
T975180615476 62
T145151215912 33
B833190315864 62
T553161221162 79
B332150327710 95
B835170321817 1
B108160315983 50
A272161207549 49
T764160615292 17
B113160315008 61
A367191207438 13
A898170307219 85
A556150615442 0
B455180315838 89
T208171221882 58
T121171215864 77
B723191227463 9
A761160627320 40
A979150321731 5
T732170921127 36
T214151227361 69
A371180315889 41
T550171215704 90
A906150615829 69
B936160607509 10
B505160321995 64
A296181227204 49
B360160607464 29
A613191221385 2
T949180307575 21
T665191221070 9
T268170927370 18
B416180615786 4
A831170627691 13
T740190321723 28
T428181207125 48
A178190915436 25
B964170927053 40
A212190307995 87
A388171207121 23
T828150327047 98
T725171221381 0
T666190327934 11
T857150315729 90
A431191227701 64
T581170615700 54
T705160927706 95
A205181215600 40
A432171215973 91
B535171207599 34
A149190315606 66
B871181221590 48
A479180327633 15
A648191221064 78
A752150615476 15
T838190621066 33
A959190607719 1
B226150615760 19
T347150627535 16
B674160907914 22
B682190321609 60
A881170627674 33
A540161207850 56
B360160621414 17
A875150315865 14
T325170627907 89
B466161221650 38
A697191227989 96
A315170321591 1
B393190307060 87
T143170321515 8...

标准答案

Case 1: 2 448
NA
Case 2: 2 642
NA
Case 3: 1 A
A365180921928 100
A714150315851 100
A827190915754 100
A315190607178 99
A940150327488 99
A769170327637 98
A534151215839 97
A697191227989 96
A432171215973 91
A782160321642 91
A342180615053 90
A625171221469 89
A364191227294 88
A166150307780 87
A212190307995 87
A492151215378 86
A538170307643 85
A898170307219 85
A232191207374 83
A356190327203 83
A547150907627 83
A773170607498 83
A139150307766 82
A754150627791 81
A159150321956 80
A442180927676 79
A769190921159 79
A455170307941 78
A648191221064 78
A308180927408 77
A406180621180 77
A843170921523 76
A468181207400 74
A298150615764 73
A972151227909 72
A336170915124 71
A228160621725 70
A276181227336 70
A409151207783 70
A906150615829 69
A547160307593 68
A794160907445 68
A149190315606 66
A494170921743 65
A139180621199 64
A354180327851 64
A431191227701 64
A953190615708 64
A961180907124 64
A185190321151 61
A472180907042 61
A984160321796 61
A151170321418 60
A950171207514 58
A540161207850 56
A728160307995 56
A552190927681 55
A567150621013 55
A782171207320 53
A849190627586 53
A916150907080 53
A386171207104 52
A727190607449 52
A816191221666 52
A562150607462 51
A842191215699 51
A983190321116 51
A135160927156 50
A233191215331 50
A711150307138 50
A852191215371 50
A908190307882 50
A272161207549 49
A296181227204 49
A536190615861 49
A839171207879 49
A364180615235 47
A819150915116 47
A843160615749 46
A685180921858 44
A136170307242 43
A169180907925 43
A323160607929 43
A398191215489 43
A108160621324 42
A918150321621 42
A371180315889 41
A161190327902 40
A205181215600 40
A761160627320 40
A699170321893 39
A808190627891 39
A963190927479 39
A616160315511 38
A871181207793 38
A185150607499 37
A238161207748 36
A581180307674 35
A675190321764 35
A929170927983 35
A966170321106 35
A295160627922 34
A383151207004 34
A464161221946 34
A923161207763 34
A162161221182 33
A881170627674 33
A771160921910 30
A997190327830 29
A153150615124 28
A447151207334 28
A856180907904 27
A890150627624 26
A908150315782 26
A957160321...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值