【PAT甲级真题整理二】1031~1060

1031 Hello World for U(20)字符串处理

【题意】

将一个字符串用U字形显示,若n为字符串的长度。

【解题思路】

行:(n+2)/3,列:n+2-2*行

开一个二维数组存储字符比较方便。

【代码】

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char s[100];
    char a[40][40];
    scanf("%s",s);
    int i,j;
    int n1,n2;
    int len=strlen(s);
    n1=(len+2)/3;
    n2=(len+2-n1-n1);
    for(i=1;i<=n1;i++)
    {
        for(j=1;j<=n2;j++)
            a[i][j]=' ';
    }
    int q=0;
    for(i=1;i<=n1;i++)
        a[i][1]=s[q++];
    for(i=2;i<=n2;i++)
        a[n1][i]=s[q++];
    for(i=n1-1;i>=1;i--)
        a[i][n2]=s[q++];
    for(i=1;i<=n1;i++)
    {
        for(j=1;j<=n2;j++)
            printf("%c",a[i][j]);
        printf("\n");
    }
    return 0;
}

1032 Sharing(25)链表

【题意】

给两个单词的初始字母的节点地址,再给n个节点,每个节点由地址,字符,和指向下一个字符的地址构成,输出两个单词相同的字母的那个节点的地址。

【解题思路】

这里不用链表做,链表真是代码太长了,直接用结构存储就可以了,为了方便再定义一个vis数组,将第一个单词出现过的字母的地址都记为1,等到遍历第二个单词的时候,一旦vis数组=1,即说明这个字母和上一个单词重复了。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int vis[maxn];
struct letter
{
    int st,en;
    char a;
}l[maxn];
int main()
{
    int a,b,a2,b2,n,x,t,flag=0;
    char c;
    memset(vis,0,sizeof(vis));
    scanf("%d%d%d",&a,&b,&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d %c %d",&a2,&c,&b2);
        l[a2].st=a2;
        l[a2].en=b2;
        l[a2].a=c;
    }
    x=a;
    while(x!=-1)
    {
        vis[x]=1;
        x=l[x].en;
    }
    x=b;
    while(x!=-1)
    {
        if(vis[x])
        {
            t=x;
            flag=1;
            break;
        }
        x=l[x].en;
    }
    if(flag)printf("%05d\n",t);
    else printf("-1\n");
    return 0;
}

1035 Password(20)模拟

【题意】

给n个用户名和密码,把密码中的1改为@,0改为%,l改为L,O改为o。让你输出需要修改密码的用户名个数,以及对应的用户名和密码,按输入的顺序。如果没有用户需要修改,则输出对应的语句,注意单复数。

【解题思路】

水题没啥好说的,注意单复数!!不然一直会有1个测试点过不了。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
struct user
{
    char a[25],b[25];
    int f=0;
}u[maxn];
int main()
{
    int n,num=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s %s",&u[i].a,&u[i].b);
        int l=strlen(u[i].b);
        int flag=0;
        for(int j=0;j<l;j++)
        {
            if(u[i].b[j]=='1')
            {
                u[i].b[j]='@';
                flag++;
            }
            else if(u[i].b[j]=='0')
            {
                u[i].b[j]='%';
                flag++;
            }
            else if(u[i].b[j]=='O')
            {
                u[i].b[j]='o';
                flag++;
            }
            else if(u[i].b[j]=='l')
            {
                u[i].b[j]='L';
                flag++;
            }
        }
        if(flag!=0)
        {
            num++;
            u[i].f=1;
        }
    }
    if(!num && n>1)printf("There are %d accounts and no account is modified\n",n);
    else if(!num && n==1)printf("There is %d account and no account is modified\n",n);
    else
    {
        printf("%d\n",num);
        for(int i=0;i<n;i++)
        {
            if(u[i].f)
                printf("%s %s\n",u[i].a,u[i].b);
        }
    }
    return 0;
}

1036 Boys vs Girls(25)排序

【题意】

给n个学生,输出男生中成绩最低的人的名字和学号,输出女生中成绩最高的人的名字和学号,并输出成绩的差值。若没有男生或没有女生,在那一栏输出“Absent”,成绩的差值输出"NA"。

【解题思路】

排序即可,注意细节。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
struct people
{
    char name[15];
    char sno[15];
    int score;
}a[maxn],b[maxn];
bool cmp(people a,people b)
{
    return a.score<b.score;
}
int main()
{
    char c;
    int n,k1=0,k2=0;
    scanf("%d",&n);
    while(n--)
    {
        char s[15];
        scanf("%s %c",s,&c);
        if(c=='M')
        {
            strcpy(a[k1].name,s);
            scanf("%s %d",a[k1].sno,&a[k1].score);
            //printf("%s %s %d\n",a[k1].name,a[k1].sno,a[k1].score);
            k1++;
        }
        else
        {
            strcpy(b[k2].name,s);
            scanf("%s %d",b[k2].sno,&b[k2].score);
            k2++;
        }
    }
    sort(a,a+k1,cmp);
    sort(b,b+k2,cmp);
    if(k2==0)
    {
        printf("Absent\n");
        printf("%s %s\n",a[0].name,a[0].sno);
        printf("NA\n");
    }
    else if(k1==0)
    {
        printf("%s %s\n",b[k2-1].name,b[k2-1].sno);
        printf("Absent\n");
        printf("NA\n");
    }
    else
    {
        printf("%s %s\n",b[k2-1].name,b[k2-1].sno);
        printf("%s %s\n",a[0].name,a[0].sno);
        printf("%d\n",b[k2-1].score-a[0].score);

    }
    return 0;

}

1037 Magic Coupon(25)排序

【题意】

题目说了那么多,就是给你两个序列,分别选取元素进行一对一相乘,求得到的最大乘积。

【解题思路】

将两个序列的正和负数分开,排个序,负数从小到大排,正数从大到小排,然后分别相乘就可以了。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn],b[maxn],c[maxn],d[maxn];
bool cmp(int a ,int b)
{
    return a>b;
}
int main()
{
    int n,k1=0,k2=0,j1=0,j2=0,ans=0;
    scanf("%d",&n);
    while(n--)
    {
        int x;
        scanf("%d",&x);
        if(x>=0)a[k1++]=x;
        else b[k2++]=x;
    }
     scanf("%d",&n);
     while(n--)
     {
        int x;
        scanf("%d",&x);
        if(x>=0)c[j1++]=x;
        else d[j2++]=x;
     }
    sort(a,a+k1,cmp);sort(c,c+j1,cmp);
    sort(b,b+k2);sort(d,d+j2);
    for(int i=0;i<k1 && i<j1;i++)
        ans+=a[i]*c[i];
    for(int i=0;i<k2 && i<j2;i++)
        ans+=b[i]*d[i];
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39826163/article/details/81672603
今日推荐