zoukankan      html  css  js  c++  java
  • PAT 1028 List Sorting[排序][一般]

    1028 List Sorting (25)(25 分)

    Excel can sort records according to any column. Now you are supposed to imitate this function.

    Input

    Each input file contains one test case. For each case, the first line contains two integers N (<=100000) and C, where N is the number of records and C is the column that you are supposed to sort the records with. Then N lines follow, each contains a record of a student. A student's record consists of his or her distinct ID (a 6-digit number), name (a string with no more than 8 characters without space), and grade (an integer between 0 and 100, inclusive).

    Output

    For each test case, output the sorting result in N lines. That is, if C = 1 then the records must be sorted in increasing order according to ID's; if C = 2 then the records must be sorted in non-decreasing order according to names; and if C = 3 then the records must be sorted in non-decreasing order according to grades. If there are several students who have the same name or grade, they must be sorted according to their ID's in increasing order.

    Sample Input 1

    3 1
    000007 James 85
    000010 Amy 90
    000001 Zoe 60

    Sample Output 1

    000001 Zoe 60
    000007 James 85
    000010 Amy 90

    Sample Input 2

    4 2
    000007 James 85
    000010 Amy 90
    000001 Zoe 60
    000002 James 98

    Sample Output 2

    000010 Amy 90
    000002 James 98
    000007 James 85
    000001 Zoe 60

    Sample Input 3

    4 3
    000007 James 85
    000010 Amy 90
    000001 Zoe 60
    000002 James 90

    Sample Output 3

    000001 Zoe 60
    000007 James 85
    000002 James 90
    000010 Amy 90

    题目大意:excel表格可以根据任一行排序,模拟excel的排序。 

    #include <stdio.h>
    #include<iostream>
    #include <algorithm>
    using namespace std;
    struct Stu{
        string id,name;
        int score;
    }stu[100000];
    int m;
    bool cmp(Stu& a,Stu& b){
        if(m==1)
            return a.id<b.id;
        else if(m==2){
            if(a.name<b.name)
                return true;
            else if(a.name==b.name)
                return a.id<b.id;
        }
        else if(m==3){
            if(a.score<b.score)
                return true;
            else if(a.score==b.score)
                return a.id<b.id;
        }
        return false;
    }
    int main() {
        int n;
        cin>>n>>m;
        for(int i=0;i<n;i++){
            cin>>stu[i].id>>stu[i].name;
            cin>>stu[i].score;
        }
        sort(stu,stu+n,cmp);
        for(int i=0;i<n;i++)
            cout<<stu[i].id<<" "<<stu[i].name<<" "<<stu[i].score<<"\n";
        return 0;
    }

    //这样写的代码,可以在牛客网上通过,但是在pat上有最后一个测试点运行超时。应该是因为使用string比较,超时了,应该把它们作为int 来比较,所以说c++ 中带的string比较复杂度较高。

    #include <stdio.h>
    #include<iostream>
    #include <algorithm>
    #include<string.h>
    using namespace std;
    struct Stu{
        char name[10];
        int id,score;
    }stu[100000];
    int m;
    bool cmp(Stu& a,Stu& b){
        if(m==1)
            return a.id<b.id;
        else if(m==2){
            if(strcmp(a.name,b.name)==0)
                return a.id<b.id;
            else
                return strcmp(a.name,b.name)<=0;
        }
        else if(m==3){
            if(a.score<b.score)
                return true;
            else if(a.score==b.score)
                return a.id<b.id;
        }
        return false;
    }
    int main() {
        int n;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++){
            scanf("%d%s%d",&stu[i].id,&stu[i].name,&stu[i].score);
        }
        sort(stu,stu+n,cmp);
        for(int i=0;i<n;i++)
            printf("%06d %s %d\n",stu[i].id,stu[i].name,stu[i].score);
        return 0;
    }

    代码改成了这样,但是一开始我根据题意,name不超过8个字符,我就定义了字符数组是name[8],只通过了3个点,将其改为10,就通过了。懂了!因为如果正好有8个字符,但是不能放最后一个结束符,这就出现了问题,不符合字符数组的定义了!

    1.字符数组

    题中之所以改为10,是因为使用的字符串%s输入,比如可以直接用char c[ ]="C program";来初始化字符数组,但此时c的长度是10不是9,因为字符串常量的最后由系统加上一个'\0',所以字符数组c中不得不存储了一个'\0'表示结束。

    2.strcmp函数用法

    当s1>s2时,返回为正数;

    当s1=s2时,返回值为0;

    当s1<s2时,返回为负数;

    返回的号与字符数组的方向是一致的,不一定是1或-1的(C中并没有规定)。

    比较的是ASCII字符的大小,

    #include <stdio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    
    int main() {
        char a[2]={'a','a'};
        char b[2]={'A','A'};//由于在ASCII中,A的号是65,而a是97
        cout<<strcmp(a,b);//所以a是大于b的。
        //应该输出一个正数才对。
        return 0;
    }//输出结果为1.
  • 相关阅读:
    删除所有空白列 cat yum.log | awk '{$1=$2=$3=$4=null;print $0}'>>yum.log1 sed ‘s/[ ]*$//g' 删除所有空格 sed -i s/[[:space:]]//g yum.log
    make clean 清除之前编译的可执行文件及配置文件。 make distclean 清除所有生成的文件。
    ipmitool -I lanplus -H 10.1.81.90 -U admin -P admin mc reset cold
    netperf对比
    iozone
    CentOS 7 vs. CentOS 8 版本差异大比拼
    seajs模块化jQuery与jQuery插件【转】
    教你怎么写jQuery的插件
    Jquery特效之=》仿京东多条件筛选特效
    sql FOR XML PATH('')
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/9442272.html
Copyright © 2011-2022 走看看