【PAT甲级真题整理四】1091~1120

1092 To Buy or Not to Buy(20)模拟

【题意】

Eva需要给定数目及颜色的珠子,若商店的珠子满足她的需求,则输出Yes,并输出她需要多买多少珠子,如果不能满足则输出No,并输出还差多少珠子可以满足她的需求。

【解题思路】

用s1存储Eva需要的不同颜色珠子的个数,s2存储商店有的不同颜色珠子的个数,然后比较就可以了。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
char a[maxn],b[maxn];
int s1[205],s2[205];
int main()
{
    int flag=1,ans1=0,ans2=0;
    scanf("%s%s",a,b);
    for(int i=0;i<strlen(b);i++)
        s1[b[i]]++;
    for(int i=0;i<strlen(a);i++)
        s2[a[i]]++;
    for(int i=0;i<205;i++)
    {
        if(s1[i]>s2[i])
        {
            flag=0;
            ans2+=s1[i]-s2[i];
        }
        else ans1+=s2[i]-s1[i];
    }
    if(flag)printf("Yes %d\n",ans1);
    else printf("No %d\n",ans2);
    return 0;
}

1093 Count PAT's(25)思维

【题意】

给一个字符串输出最多能构成多少PAT。

【解题思路】

这是一道思维题……暴力的话只能拿15分。只要记录对于每一个A,前面有多少个P,后面有多少个T,他们的乘积即是这个A能组成的PAT的个数,然后所有相加即是最终答案。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const int mod=1000000007;
char s[maxn];
int main()
{
    scanf("%s",s);
    int len=strlen(s);
    int ans=0,cntP=0,cntA=0,cntT=0;
    for(int i=0;i<len;i++)
        if(s[i]=='T')cntT++;
    for(int i=0;i<len;i++)
    {
        if(s[i]=='P')cntP++;
        else if(s[i]=='T')cntT--;
        else if(s[i]=='A')ans=(ans+cntP%mod*cntT%mod)%mod;
    }
    printf("%d\n",ans);
    return 0;
}

1094 The Largest Generation(25)dfs或bfs

【题意】

给一棵树,计算哪一层的结点数最多,并输出该结点数和所在层数。

【解题思路】

用dfs或bfs都可以,用book数组记录每一层的结点数。用bfs时,用level数组记录每个节点所在的层数。

【代码】

dfs:

#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
vector<int>v[maxn];
int book[maxn];
void dfs(int x,int level)
{
    book[level]++;
    for(int i=0;i<v[x].size();i++)
        dfs(v[x][i],level+1);
}
int main()
{
    memset(book,0,sizeof(book));
    int n,m;
    scanf("%d%d",&n,&m);
    while(m--)
    {
        int x,num,t;
        scanf("%d%d",&x,&num);
        while(num--)
        {
            scanf("%d",&t);
            v[x].push_back(t);
        }
    }
    dfs(1,1);
    int ans=0,index=1;
    for(int i=0;i<maxn;i++)
    {
        if(book[i]>ans)
        {
            ans=book[i];
            index=i;
        }
    }
    printf("%d %d\n",ans,index);
    return 0;
}

bfs:

#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
vector<int>v[maxn];
queue<int>q;
int level[maxn],book[maxn];
void bfs()
{
    q.push(1);
    level[1]=1;
    while(!q.empty())
    {
        int t=q.front();
        q.pop();
        book[level[t]]++;
        for(int i=0;i<v[t].size();i++)
        {
            level[v[t][i]]=level[t]+1;
            q.push(v[t][i]);
        }
    }
}
int main()
{
    memset(book,0,sizeof(book));
    memset(level,0,sizeof(level));
    int n,m;
    scanf("%d%d",&n,&m);
    while(m--)
    {
        int x,num;
        scanf("%d%d",&x,&num);
        while(num--)
        {
            int t;
            scanf("%d",&t);
            v[x].push_back(t);
        }
    }
    bfs();
    int ans=0,index=1;
    for(int i=0;i<maxn;i++)
    {
        if(book[i]>ans)
        {
            ans=book[i];
            index=i;
        }
    }
    printf("%d %d\n",ans,index);
    return 0;
}

1097 Deduplication on a Linked List(25)链表

【题意】

给一个链表,去重(去掉值或者绝对值相等的),先输出删除后的链表,再输出删除了的链表。

【解题思路】

用结构存储每个节点的信息,s1数组存储保留下的链表的信息,s2数组存储删除的链表的信息,用set记录每个key,当key在set中存在时则将该节点存入s2,否则则存入s1。注意最后输出时最后节点的next要改为-1,并且s2数组只有在cnt2>=1时才输出,不然会有一个测试点过不了。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct Node
{
    int addr,key,next;
}node[maxn];
int s1[maxn],s2[maxn];
int main()
{
    int head,n,cnt1=0,cnt2=0;
    scanf("%d%d",&head,&n);
    while(n--)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        node[a].addr=a;node[a].key=b;node[a].next=c;
    }
    set<int>s;
    while(head!=-1)
    {
        int t=abs(node[head].key);
        if(!s.count(t))
        {
            s1[cnt1++]=node[head].addr;
            s.insert(t);
        }
        else s2[cnt2++]=node[head].addr;
        head=node[head].next;
    }
    for(int i=0;i<cnt1-1;i++)
        printf("%05d %d %05d\n",s1[i],node[s1[i]].key,s1[i+1]);
    printf("%05d %d -1\n",s1[cnt1-1],node[s1[cnt1-1]].key);
    if(cnt2>=1)
    {
        for(int i=0;i<cnt2-1;i++)
            printf("%05d %d %05d\n",s2[i],node[s2[i]].key,s2[i+1]);
        printf("%05d %d -1\n",s2[cnt2-1],node[s2[cnt2-1]].key);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39826163/article/details/82081570