PAT B1041:考试座位号

  • long long的范围:-9223372036854775808到9223372036854775807,(10^18^数量级),取值范围(-2^63^~(2^63^-1)) %lld;
  • 思路:用结构体存储信息,person[i],i表示机试座位号;

    #include <cstdio>
    
    struct Person{
        long long id;
        int table;
    }person[1001];
    
    int main(){
        int n,jnum,znum;
        long long temp;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%lld %d %d",&temp,&jnum,&znum);
            person[jnum].id=temp;
            person[jnum].table=znum;
        }
        int k;
        scanf("%d",&k);
        while(k--){
            scanf("%d",&jnum);
            printf("%lld %d\n",person[jnum].id,person[jnum].table);
        }
        return 0;
    }
    

PAT B1004:成绩排名

  • 题目要求只要MAX和MIN,所以考虑创建max=-1,min=101,通过输入的grade与max、min对比更新max,min即可;
  • 思路:(方法一)创建一个结构体保存信息,创建此类型结构体temp,max,min,将更新的信息存入进去;

    #include <cstdio>
    
    struct stu {
        char name[15];
        char id[15];
        int grade;
    } tmp, min, max;
    
    int main() {
        int n;
        scanf("%d",&n);
        min.grade = 101;
        max.grade = -1;
        for (int i = 0; i < n; i++) {
            scanf("%s %s %d", tmp.name, tmp.id, &tmp.grade);
            if (tmp.grade < min.grade)
                min = tmp;
            if (tmp.grade > max.grade)
                max = tmp;
        }
        printf("%s %s\n", max.name, max.id);
        printf("%s %s\n", min.name, min.id);
        return 0;
    }
  • :(方法二)直接创建nmin2,nmax2,两个二维数组来存姓名和id;

    #include <cstdio>
    #include <cstring>
    
    int main(){
        int n,max=-1,min=101,grade;
        char nmin[2][11],nmax[2][11];
        char temp[2][11];
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%s %s %d",temp[0],temp[1],&grade);
            if(grade>max){
                strcpy(nmax[0],temp[0]);
                strcpy(nmax[1],temp[1]);
                max=grade;
            }
            if(grade<min){
                strcpy(nmin[0],temp[0]);
                strcpy(nmin[1],temp[1]);
                min=grade;
            }
        }
        printf("%s %s\n",nmax[0],nmax[1]);
        printf("%s %s\n",nmin[0],nmin[1]);
        return 0;
    }

PAT B1028:人口普查

  • c函数 (string) :strcmp(a,b) 若a>b返回>0、a=b返回0、a<b返回<0;
  • strcpy(d,s),将s字符串复制到d中,对于建立的字符数组不能直接赋值,通过strcpy将目标字符赋值进去;
  • 思路:由于年份正好是递增的,将其存为字符串形式,可通过strcmp(字典序)判断大小、用结构体Preson存name和year,建立temp,min,max结构体,最后得出答案,注意count=0的情况;

    #include <cstdio>
    #include <cstring>
    
    const char left[15]="1814/09/06";
    const char right[15]="2014/09/06";
    
    struct Person{
        char name[6];
        char year[15];
    }temp,min,max;
    
    int main(){
        int n,count=0;
        strcpy(max.year,"2014/09/06");
        strcpy(min.year,"1814/09/06");
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%s %s",temp.name,temp.year);
            if(strcmp(temp.year,left)>=0&&strcmp(temp.year,right)<=0){
                if(strcmp(temp.year,max.year)<0){
                    strcpy(max.year,temp.year);
                    strcpy(max.name,temp.name);
                }
                if(strcmp(temp.year,min.year)>0){
                    strcpy(min.year,temp.year);
                    strcpy(min.name,temp.name);
                }
                count++;
            }
        }
        if(count>0)
            printf("%d %s %s",count,max.name,min.name);
        else
            printf("0");
        return 0;
    }
    

PAT B1032:挖掘机技术哪家强

  • 思路:用数组来存储各个学校的总分数,每次累加,最后遍历找出max;

    #include <cstdio>
    
    int main(){
        int n,id,grade;
        int school[100005]={0};
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d %d",&id,&grade);
            school[id]+=grade;
        }
        int max=-1,mid=0;
        for(int i=1;i<100001;i++){
            if(school[i]>max){
                max=school[i];
                mid=i;
            }
        }
        printf("%d %d",mid,max);
        return 0;
    }

PAT A1011:World Cup Betting

  • 题目大意:求最大profit,给出3组,找出每组最大收益,及其对应的字母(W,T,L),最后按照公式求出profit;
  • double 输入:%lf %.2f保留两位;
  • 思路:在输入的同时寻找每组的最大值及其对应的字母,输出字母(边输入,边输出),注意对应每种判断的max值都要重置为0.0;

    #include <cstdio>
    
    int main(){
        int temp;
        char show[3]={'W','T','L'};
        double income,max=0.0;
        double profit=1.0;
        for(int i=0;i<3;i++){
            max=0.0;
            for(int j=0;j<3;j++){
                scanf("%lf",&income);
                if(income>max){
                    max=income;
                    temp=j;
                }
            }
            printf("%c ",show[temp]);
            profit*=max;
        }
        profit=(profit*0.65-1)*2;
        printf("%.2f",profit);
        return 0;
    }
    

PAT A1006:Sign In and Sign Out

  • 题目大意:输出最早开门人与最晚关门人的id
  • 结构体之间可以直接赋值(如令结构体first=temp);
  • 思路:因为只输出min和max,所以在输入时进行比较选择。用char数组存储id和时间,通过strcmp、strcpy操作比较与赋值(注意:直接在目标结构体fist和last中,初始化时间,用temp比较后直接使first/last=temp);

    #include <cstdio>
    #include <cstring>
    
    struct Stu{
        char id[16];
        char mor[10],aft[10];
    }temp,first,last;
    
    int main(){
        int n;
        strcpy(first.mor,"23:59:59");
        strcpy(last.aft,"00:00:01");
        scanf("%d",&n);
        while(n--){
            scanf("%s %s %s",temp.id,temp.mor,temp.aft);
            if(strcmp(first.mor,temp.mor)>0){
                first=temp;
            }
            if(strcmp(last.aft,temp.aft)<0){
                last=temp;
            }
        }
        printf("%s %s",first.id,last.id);
        return 0;
    }
    
  • (方法二):构建比较函数,求得最值
    比较函数传入需要比较的结构体(a,b),若a>b则返回true,否则false;求最小时间传入(temp,first)结果为false就赋值,最大时间结果为true赋值;

    #include <cstdio>
    
    struct Stu{
        char name[16];
        int hh,mm,ss;
    }temp,first,last;
    
    bool cmp(Stu a,Stu b){
        if(a.hh!=b.hh)    return a.hh>b.hh;
        else if(a.mm!=b.mm)    return a.mm>b.mm;
        else    return a.ss>b.ss;
    }
    
    int main(){
        int n;
        first.hh=24,first.mm=0,first.ss=0;
        last.hh=0,last.mm=0,last.ss=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%s %d:%d:%d",temp.name,&temp.hh,&temp.mm,&temp.ss);
            if(cmp(temp,first)==false)    first=temp;
            scanf("%d:%d:%d",&temp.hh,&temp.mm,&temp.ss);
            if(cmp(temp,last)==true)    last=temp;
        }
        printf("%s %s",first.name,last.name);
        return 0;
    }

PAT A1036:Boys vs Girls

  • 题目大意:输出女生max成绩和男生min成绩,并求出之间的差值;可能没有男/女,则Absent;
  • 思路:结构体存储信息,初始化男女成绩通过输入的字符M和F判断男女,进行比较与赋值,最后看情况输出(初始化:男101,女-1);

    #include <cstdio>
    
    struct Stu{
        char name[12],id[12];
        int grade;
    }temp,male,female;
    
    int main(){
        int n;
        char g;
        male.grade=101;
        female.grade=-1;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%s %c %s %d",temp.name,&g,temp.id,&temp.grade);
            if(g=='M'){
                if(temp.grade<male.grade)
                    male=temp;
            }else{
                if(temp.grade>female.grade)
                    female=temp;
            }
        }
        if(female.grade==-1)    printf("Absent\n");
            else    printf("%s %s\n",female.name,female.id);
        if(male.grade==101)    printf("Absent\n");
            else    printf("%s %s\n",male.name,male.id);
        if(male.grade==101||female.grade==-1)    printf("NA");
            else    printf("%d",female.grade-male.grade);
        return 0;
    }