算法笔记3.2 - 3.5(pat题目

B类题目

B1041

主要考察查找问题,可以建立一个结构体数组,里面存放id和testseat。输入时将内容赋值给T[seat],输出时直接输出T[seat]即可。
注意不能直接用char[16],因为字符数组不能一次赋值,需要循环赋值,可以用long long

#include<cstdio>
const int N = 1010;
struct student
{
    long long id;
    int examseat;
}testnum[N];
int main()
{
    long long id;
    int examseat, seat;
    int n, m;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%lld %d %d", &id, &seat, &examseat);
        testnum[seat].id = id;
        testnum[seat].examseat = examseat;
    }
    scanf("%d", &n);
    while(n--)
    {
        scanf("%d", &m);
        printf("%lld %d\n",testnum[m].id, testnum[m].examseat);
    }
    return 0;
}

B1028

本题先定义一个结构体,同时写一个大于等于函数和小于等于函数,定义5个结构体变量,temp用于读入,最大最小人,左右边界。初始化时先将最大最小左右边界的年月日赋值。输入时用temp读入同时设置cnt变量记录有效读入数,如果大于左边界小于右边界则合乎规范,cnt + 1并且更新max min。

#include<cstdio>
struct person
{
    char name[10];
    int yy, mm, dd;
}temp, left, right, old, young;
bool MoreEqu(person a, person b)
{
    if(a.yy != b.yy) return a.yy >= b.yy;
    if(a.mm != b.mm) return a.mm >= b.mm;
    if(a.dd != b.dd) return a.dd >= b.dd;
}
bool LessEqu(person a, person b)
{
    if(a.yy != b.yy) return a.yy <= b.yy;
    if(a.mm != b.mm) return a.mm <= b.mm;
    if(a.dd != b.dd) return a.dd <= b.dd;
}
void Init()
{
    left.yy = young.yy = 1814;
    right.yy = old.yy = 2014;
    left.mm = young.mm = right.mm = old.mm = 9;
    left.dd = young.dd = right.dd = old.dd = 6;
}
int main()
{
    Init();
    int n, cnt = 0;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%s %d/%d/%d", temp.name, &temp.yy, &temp.mm, &temp.dd);
        if(MoreEqu(temp, left) && LessEqu(temp, right))
        {
            cnt++;
            if(MoreEqu(temp, young)) young = temp;
            if(LessEqu(temp, old)) old = temp;
        }
    }
    if(cnt == 0) printf("0");
    else printf("%d %s %s", cnt, old.name, young.name);
    return 0;
}

B1027

本题是图形输出题目,设置bottom变量又来确定最底行需要输出的个数,首先由数学表达式得出x≤(2*(n+1))1/2,如果bottom为偶数再减1,然后正常输出即可。

#include<cstdio>
#include<cmath>
int main()
{
    char c;
    int n;
    scanf("%d %c", &n, &c);
    int bottom = (int)sqrt(2.0 * (n + 1)) - 1;
    if(bottom % 2 == 0) bottom --;
    int used = (bottom + 1) * (bottom + 1) / 2 - 1;
    for(int i = bottom; i >= 1; i = i - 2)
    {
        for(int j = 0; j < (bottom - i) / 2; j++)
            printf(" ");
        for(int j = 0; j < i; j++)
            printf("%c", c);
        printf("\n");
    }
    for(int i = 3; i <= bottom; i = i + 2)
    {
        for(int j = 0; j < (bottom - i) / 2; j++)
            printf(" ");
        for(int j = 0; j < i; j++)
            printf("%c", c);
        printf("\n");
    }
    printf("%d", n -  used);
    return 0;
}

B1037

本题和时间换算一样的,注意输出格式即可

#include<cstdio>
#include<algorithm>
int main()
{
    int g, s, k;
    scanf("%d.%d.%d", &g, &s, &k);
    int pay = k + s *29 + g * 29 * 17;
    scanf("%d.%d.%d", &g, &s, &k);
    int have = k + s *29 + g * 29 * 17;
    int res = have - pay;
    if(have < pay)
    {
        printf("-");
        res = -1 * res;
    }
    printf("%d.%d.%d", res / (29 * 17), res % (29 * 17) / 29,res % 29);
    return 0;
}

A类题目

A1011

本题也是查找数字的题目,用两层循环进行读入。外循环读入三行,内循环读入三个数字,每次读入数字时都更新最大值,在内循环结束时,进行累乘并且输入当前行最大行所对应的字母。最后用%.02输入两位有效数字。

#include<cstdio>
char S[3] = {'W','T','L'};
int main()
{
    float temp, a, sum = 1.0;
    int k;
    for(int i = 0; i < 3; i++)
    {
        temp = 0.0;
        for(int j =0; j < 3; j++)
        {
            scanf("%f", &a);
            if(a > temp)
            {
                temp = a;
                k = j;
            }
        }
        sum = sum * temp;
        printf("%c ",S[k]);
    }
    printf("%.02f", (sum * 0.65 - 1) * 2);
    return 0;
    
}

A1006

本题和年龄监测题目一样,先写入一个大于等于的时间函数。同时定义最迟最早和temp结构体变量。先初始化最迟最早的时间。在循环中第一次读入的是最早时间的,对最早时间进行更新。再读入数据是最迟时间,对最迟时间进行更新。

#include<cstdio>
struct person
{
    char id[20];
    int hh, mm, ss;
}temp, max, min;
bool MoreEqu(person a, person b)
{
    if(a.hh != b.hh) return a.hh >= b.hh;
    if(a.mm != b.mm) return a.mm >= b.mm;
    if(a.ss != b.ss) return a.ss >= b.ss;
}
int main()
{
    int n;
    scanf("%d", &n);
    max.hh = -1, max.mm = 0, max.ss = 0;
    min.hh = 24, min.mm = 60, min.ss = 60;
    while(n--)
    {
        scanf("%s %d:%d:%d", temp.id, &temp.hh, &temp.mm, &temp.ss);
        if(MoreEqu(min, temp)) min = temp;
        scanf("%d:%d:%d", &temp.hh, &temp.mm, &temp.ss);
        if(MoreEqu(temp, max)) max = temp;
    }
    printf("%s %s",min.id, max.id);
    return 0;
}

A1036

本题和前面的都是一样的,设置男生最小值和女生最大值和temp三个结构体变量。开始时要对男小和女大变量进行初始化。用temp和一个临时变量gender读入数据,根据gender确定是男生和女生同时做出相应的更新。输出时如果男小或者女大的值等于初始值说明此变量没有更新,从而做出给定输出。

#include<cstdio>
struct student
{
    char name[15];
    char id[15];
    int grade;
}temp, fmax, mmin;
int main()
{
    int n;
    char gender;
    scanf("%d", &n);
    fmax.grade = -1;
    mmin.grade = 101;
    while(n --)
    {
        scanf("%s %c %s %d",temp.name, &gender, temp.id, &temp.grade);
        if(gender == 'F')
            if(temp.grade > fmax.grade)
                fmax = temp;
        if(gender == 'M')
            if(temp.grade < mmin.grade)
                mmin = temp;
    }
    if(fmax.grade == -1) printf("Absent\n");
    else printf("%s %s\n", fmax.name, fmax.id);
    if(mmin.grade == 101) printf("Absent\n");
    else printf("%s %s\n", mmin.name, mmin.id);
    if(fmax.grade == -1 || mmin.grade == 101) printf("NA\n");
    else printf("%d", fmax.grade - mmin.grade);
    return 0;
}

A1031

本题关键是正确表示行和列的规律,n1 = n2 = (N + 2) / 3,可以用二维数组输出,也可以直接控制输出。

直接控制:

#include<cstdio>
#include<cstring>
int main()
{
    char str[100];
    scanf("%s", str);
    int N = strlen(str);
    int n1 = (N + 2) / 3, n3 = n1, n2 = N + 2 - n1 - n3;
    for(int i = 0; i < n1 - 1; i++)
    {
        printf("%c", str[i]);
        for(int j = 0; j < n2 - 2; j++)
            printf(" ");
        printf("%c\n", str[N - i - 1]);
    }
    for(int i = 0; i < n2; i++)
        printf("%c", str[n1 - 1 + i]);
    return 0;
}

二维数组:

#include<cstdio>
#include<cstring>
char str[100], ans[40][40];
int main()
{
    scanf("%s", str);
    int N = strlen(str);
    int n1 = (N + 2) / 3, n3 = n1, n2 = N + 2 - n1 - n3;
    for(int i = 1; i <= n1; i++)
    {
        for(int j = 1; j <= n2; j++)
            ans[i][j] = ' ';
    }
    int pos = 0;
    for(int i = 1; i <= n1; i++)
        ans[i][1] = str[pos++];
    for(int i = 2; i <= n2; i++)
        ans[n1][i] = str[pos++];
    for(int i = n3 - 1; i >= 1; i--)
        ans[i][n2] = str[pos++];
    for(int i = 1; i <= n1; i++)
    {
        for(int j = 1; j <=n2; j++)
            printf("%c", ans[i][j]);
        printf("\n");
    }
    return 0;
}

A1019

进制转换+回文数判断

#include<cstdio>
int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    int z[40],num = 0;
    bool flag = true;
    do{
        z[num++] = a % b;
        a = a / b;
    }while(a != 0);
    for(int i = 0; i < (num) / 2; i++)
    {
        if(z[i] !=  z[num - 1 - i])
        {
            flag = false;
            break;
        }
    }
    if(flag) printf("Yes\n");
    else printf("No\n");
    for(int i = num - 1; i >= 0; i--)
    {
        printf("%d", z[i]);
        if(i != 0) printf(" ");
    }
    return 0;
}

A1027

设置一个字符数组对应字符即可

#include<cstdio>
char radix[13] = {'0','1','2','3','4','5','6','7','8','9','A','B','C'};
int main()
{
    int r, g, b;
    scanf("%d %d %d", &r, &g, &b);
    printf("#");
    printf("%c%c", radix[r / 13], radix[r % 13]);
    printf("%c%c", radix[g / 13], radix[g % 13]);
    printf("%c%c", radix[b / 13], radix[b % 13]);
    return 0;
}

A1058

模拟加法运算加一个进位即可,注意和B1037减法做对应

#include<cstdio>
int main()
{
    int a[3], b[3], c[3];
    scanf("%d.%d.%d", &a[2], &a[1], &a[0]);
    scanf("%d.%d.%d", &b[2], &b[1], &b[0]);
    int carry = 0;
    c[0] = (a[0] + b[0]) % 29;
    carry = (a[0] + b[0]) / 29;
    c[1] = (a[1] + b[1] + carry) % 17;
    carry = (a[1] + b[1] + carry) / 17;
    c[2] = a[2] + b[2] + carry;
    printf("%d.%d.%d\n", c[2], c[1], c[0]);
    return 0;
}

进制转换问题:

进制转换需要两步:
1.将p进制数转换成10进制数

int y = 0, product = 1;
while(x != 0)
{
    y = y + (x % 10) * product;  //取出x的个位并且乘以对应的位权
    x = x / 10;  //去掉x的个位
    product = product * p;  //p是p进制
}

2.将10进制数转换成y进制数z

int z[num], num = 0;
do{
    z[num ++] = y % Q;
    y = y / Q;
}while(y != 0);
注意不要使用while循环否则若y=0会出错,正确的应该是z[0]=0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值