[PAT Basic Level] 1065~1067

1065. 单身狗

题目分析:

题目稍微有些繁琐,但思路不难。为了快速查看该客人是否在伴侣列表中,这里建议开一个大小为100000的int数组,以客人的ID作为数组的下标这样采用数组随机访问的方式达到 O ( 1 ) O(1) O(1)的查找速度。
然后根据输入的伴侣信息,数组中存储当前ID对应的伴侣ID。在判定是否落单时,只需要判定该客人的ID是否在伴侣列表中以及如果在的话其伴侣是否也在当前参加派对列表中。然后需要注意输出ID的时候前面的0也是要保留的。

源代码

#include <cstdio>

int main()
{
    int num;
    scanf("%d",&num);
    int *cpList=new int[100000];  //储存伴侣另一半的编号
    int *quryList=new int[100000]; 
    bool *notSingle=new bool[100000];
    for(int i=0;i<100000;++i) {//初始化
        cpList[i]=0;
        quryList[i]=0;
        notSingle[i]=false;
    } 
    int id1,id2;
    for(int i=0;i<num;++i){
        scanf("%d %d",&id1,&id2);
        cpList[id1]=id2;  
        cpList[id2]=id1;
    }
    int quryNum;
    scanf("%d",&quryNum);
    
    for(int i=0;i<quryNum;++i){
        scanf("%d",&id1);
        quryList[id1]=1;  //标记为此客人存在
    }
    int count=0;
    for(int i=0;i<100000;++i){
        if(quryList[i]&&!notSingle[i]){ //此客人存在且目前还不确定是否单身
            if(cpList[i]&&quryList[cpList[i]]) notSingle[i]=notSingle[cpList[i]]=true;
            else count++;  //否则说明为单身
        }
    }
    printf("%d\n",count);
    int first=0;
    for(int i=0;i<100000;++i){
        if(quryList[i]&&!notSingle[i]){ //此客人存在且并非有伴侣
            if(first) printf(" ");
            printf("%05d",i);
            first++;
        }
    }
    delete []cpList;
    delete []quryList;
    delete []notSingle;
    return 0;
}

1066. 图像过滤

题目分析:

相对容易的一道题,不过要注意,根据题目的输入样例可以看到,过滤区间是一个闭区间,也就是说边界值也要被替换掉。

源代码

#include <cstdio>

int main()
{
    int row,colu,min,max,subst;///分辨率、过滤区间、替换值
    scanf("%d %d %d %d %d",&row,&colu,&min,&max,&subst);
    int grey;
    for(int i=0;i<row;++i){
        for(int j=0;j<colu;++j){
            if(j) printf(" ");
            scanf("%d",&grey);
            if(grey>=min&&grey<=max) printf("%03d",subst);
            else printf("%03d",grey);
        }
        printf("\n");
    }
    return 0;
}

1067. 试密码

题目分析:

这道题主要需要用到strcmp函数,当两字符串完全相等时返回0,利用这个函数可以方便地判断。
除此之外,注意下面几个方面:

  • 题目给的密码不含空格,但是测试的密码可能包含空格,所以读取字符串时需要考虑到对空格的读取;
  • 题目说密码长度不大于20,但没说测试的密码长度不大于20,之前我开的保存输入密码的数组长度也是21,但最后一个点会报运行时错误,长度改成50就正常了,所以我推测应该是最后一个点给的长度大于20

源代码

#include <cstdio>
#include <cstring>

int main()
{
    char pw[21];
    int limit;
    char attempt[50];
    scanf("%s %d",pw,&limit);
    for(int i=0;i<limit+1;++i){  //设置成可以多输入一次
        if(i==limit){ //说明输入超限
            printf("Account locked");
            break;
        }
        getchar();
        scanf("%[^\n]",attempt);
        if(strcmp(attempt,"#")==0) break;  //一行的输入只有#
        if(strcmp(attempt,pw)==0){
            printf("Welcome in");
            break;
        } 
        else printf("Wrong password: %s\n",attempt);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值