clipboard.png
这道题又一次的戳到了我的盲区;

一定要注意sort和cmp的返回值;
其实可以这么理解;
对于cmp,我们的目的是让数据按照给出的形式进行排序,例如我们想让序列递增,则排序的方式就为:
a<b;这样序列中处处都是a<b;
同理,如果构建了struct,其中包括一个string,我们希望整个序列按照字典序递增,该怎么办?
这个时候就要用到strcmp函数来做辅助;

默认情况下strcmp(a,b),当a的字典序大于b的时候,返回的就是1,等于为0,小于返回-1;
所以如果a>b,则strcamp(a,b)>0
但是我们希望的是递增,也就是a<b,所以对应的情况就是strcamp(a,b)返回-1,所以这个时候应该返回的判定条件就是strcmp(a,b)<0,也就是符合字典序a<b的那种情况;

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
using std::vector;
const int maxn=100010;
struct node{
    int id;
    char name[9];
    int grade;
}mem[maxn];

bool cmp1(node a,node b){
    return a.id<b.id;
}

bool cmp2(node a,node b){
    if(strcmp(a.name,b.name)==0)
        return a.id<b.id;
    else
        return strcmp(a.name,b.name)<0;
}

bool cmp3(node a,node b){
    if(a.grade==b.grade)
        return a.id<b.id;
    else
        return a.grade<b.grade;
}

int main(){
    int n,c;
    scanf("%d%d",&n,&c);
    for(int i=0;i<n;i++){
        scanf("%d %s %d",&mem[i].id,&mem[i].name,&mem[i].grade);
    }
    if(c==1){
        sort(mem,mem+n,cmp1);
    }else if(c==2){
        sort(mem,mem+n,cmp2);
    }else{
        sort(mem,mem+n,cmp3);
    }
    for(int i=0;i<n;i++){
        printf("%06d %s %d\n",mem[i].id,mem[i].name,mem[i].grade);
    }
    system("pause");
    return 0;
}

宋霖轩
16 声望4 粉丝

克哈的霓虹都为我闪烁


« 上一篇
PAT A1023
下一篇 »
PAT A1055