首页 > 技术文章 > 算法笔记—入门篇(1)—入门模拟(已完结)

nyist0 2018-12-25 19:18 原文

 

 入门篇(1)—入门模拟

1.简单模拟

模拟题主要考察的事代码能力,简单模拟不涉及算法,完全只是根据题目描述来进行代码的编写。

 2.剩余的树

#include<stdio.h>
#include<string.h>
int tree[10010];
int main(){
    int L,M;
    while(~scanf("%d%d",&L,&M)){
        if(L==0&&M==0) break;
        memset(tree,0,sizeof(int));
        for(int i=0;i<=L;i++){
            tree[i]=1;
        }
        int s,e;
        for(int j=0;j<M;j++){
            scanf("%d%d",&s,&e);
            for(int i=s;i<=e;i++){
                tree[i]=0;
            }
        }
        int num=0;
        for(int i=0;i<=L;i++){
            if(tree[i]==1) num++;
        }
        printf("%d\n",num);
    }
    return 0;
} 

 

3.石头剪刀布

记录甲乙赢的次数和平局的次数(平局甲乙相等),计算得出输的次数,在记录赢的同时,记下是出什么赢得本局,最后通过比较得出出哪一个赢的几率比较大

#include<stdio.h>
#include<string.h>
int main(){
    int n;
    scanf("%d",&n);
    int win1=0,los1=0;
    int win2=0,los2=0;
    int equ=0;
    char c1,c2;
    int x1=0,y1=0,z1=0;
    int x2=0,y2=0,z2=0;
    for(int i=0;i<n;i++){
        getchar(); 
        scanf("%c %c",&c1,&c2);
        if(c1=='C'&&c2=='J'||c1=='J'&&c2=='B'||c1=='B'&&c2=='C'){
            win1++;
            if(c1=='C') x1++;
            else if(c1=='J') y1++;
            else if(c1=='B') z1++;
        }else if(c1==c2){
            equ++;
        }else{
            win2++;
            if(c2=='C') x2++;
            else if(c2=='J') y2++;
            else if(c2=='B') z2++;
        }
        los1=n-win1-equ;
        los2=n-win2-equ;
    }
    printf("%d %d %d\n%d %d %d\n",win1,equ,los1,win2,equ,los2);
    
    if(x1==y1&&y1==z1){
        printf("B ");
    }else if(x1>y1&&x1>z1){
        printf("C ");
    }else if(y1>x1&&y1>z1){
        printf("J ");
    }else if(z1>x1&&z1>y1){
        printf("B ");
    }else if(x1==y1&&x1>z1){
        printf("C ");
    }else if(x1==y1&&x1>z1){
        printf("C ");
    }else if(x1==z1&&x1>y1){
        printf("B ");
    }else if(z1==y1&&z1>x1){
        printf("B ");
    }
    
    if(x2==y2&&y2==z2){
        printf("B\n");
    }else if(x2>y2&&x2>z2){
        printf("C\n");
    }else if(y2>x2&&y2>z2){
        printf("J\n");
    }else if(z2>x2&&z2>y2){
        printf("B\n");
    }else if(x2==y2&&x2>z2){
        printf("C\n");
    }else if(x2==y2&&x2>z2){
        printf("C\n");
    }else if(x2==z2&&x2>y2){
        printf("B\n");
    }else if(z2==y2&&z2>x2){
        printf("B\n");
    }
    //printf("\n1: %d %d %d\n",x1,y1,z1); 
    //printf("\n2: %d %d %d\n",x2,y2,z2); 
    return 0;
} 

 

4.A+B问题(字符串模拟加减运算)

问题也是看了别人的博客才写出来的,这种思路我是没想到,不得不佩服.

参考博客链接:https://blog.csdn.net/zh_ang_lei/article/details/48475651

#include<stdio.h>
#include<string.h>
char s1[20],s2[20];
int len1,len2;
int main(){
    while(scanf("%s %s",s1,s2)!=EOF){
        long long a=0,b=0;
        len1 = strlen(s1);
        len2 = strlen(s2);
        for(int i=0;i<len1;i++){
            if(s1[i]>='0'&&s1[i]<='9'){
                a=a*10+s1[i]-'0';
            }
        }
        if(s1[0]=='-'){
                a=-a;
        }
        for(int i=0;i<len2;i++){
            if(s2[i]>='0'&&s2[i]<='9'){
                b=b*10+s2[i]-'0';
            }
        }
        if(s2[0]=='-'){
            b=-b;
        }
        printf("%lld\n",a+b);
    }
    return 0;
}

 

5.特殊乘法

不得不说,思路就是制胜的法宝啊,借用上一题的处理思路,原本令我愁眉不解的题瞬间迎刃而解了。

#include<stdio.h>
#include<string.h>
char s1[20],s2[20];
int len1,len2;
int main(){
    while(scanf("%s %s",s1,s2)!=EOF){
        len1 = strlen(s1);
        len2 = strlen(s2);
        long long sum = 0;
        for(int i=0;i<len1;i++){
            for(int j=0;j<len2;j++){
                sum+=(s1[i]-'0')*(s2[j]-'0');
            }
        }
        printf("%lld\n",sum);
    }
    return 0;
}

 //ps:coudup网站出现故障,所以下面的题目选用了南阳理工学院的oj上的题

6.蛇形填数(经典模拟)

题目链接:http://acm.nyist.cf/problem/33

这题我没有写出来,参照别人的代码AC

参照地址:https://blog.csdn.net/qq_36238595/article/details/53537672

#include<stdio.h>
#include<string.h>
int a[101][101];
int main(){
    int n;
    scanf("%d",&n);
    int x=0,y=n-1;//行列
    int num=1;//填入的数
    a[x][y]=1;//填入第一个数
    while(num<n*n){//结束条件 
        while(x+1<n&&!a[x+1][y]){//向下填数,条件为:不超边界,且未填入数 
            a[++x][y]=++num;
        }
        while(y-1>=0&&!a[x][y-1]){//向左 
            a[x][--y]=++num;
        } 
        while(x-1>=0&&!a[x-1][y]){//向上
            a[--x][y]=++num; 
        }
        while(y+1<n&&!a[x][y+1]){//向右
            a[x][++y]=++num; 
        } 
    }
    for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                printf("%d ",a[i][j]);
            }
            printf("\n");
    }
    return 0;
}

 

 7.排序去重(数据比较小的情况下)

题目链接:http://acm.nyist.cf/problem/48

本题利用桶排序的思想,在数组允许的范围内可使用。

#include<stdio.h>
#include<string.h>
#define max 1001
int a[max];
int main(){
    int n,k;
    int sum=0;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(int i=0;i<n;i++){
        scanf("%d",&k);
        a[k]++;
    }
    for(int i=0;i<max;i++){
        if(a[i]) sum++;
    }
    printf("%d\n",sum);
    for(int j=0;j<max;j++){
        if(a[j])
            printf("%d ",j);
    }
    return 0;
}

 

8.升级版石头剪刀布

题目链接:http://acm.nyist.cf/problem/1346

#include<stdio.h>
int main(){
    int a[3000],b[3000];
    int n,na,nb;
    while(scanf("%d%d%d",&n,&na,&nb)!=EOF){
        int wa=0,wb=0;
        for(int i=0;i<na;i++){
            scanf("%d",&a[i]);
        }
        int ma=na;
        for(int j=0;j<n/na+2;j++){//复制字符串,到需要的程度 
            for(int i=0;i<na;i++){
                a[ma++]=a[i];
            }
        }
        for(int i=0;i<nb;i++){
            scanf("%d",&b[i]);
        }
        int mb=nb;
        for(int j=0;j<n/nb+2;j++){
            for(int i=0;i<nb;i++){
                b[mb++]=b[i];
            }
        }
        for(int i=0;i<n;i++){//判断输赢 
            if(a[i]==0&&b[i]==2||a[i]==0&&b[i]==3||a[i]==1&&b[i]==0||a[i]==1&&b[i]==3||a[i]==2&&b[i]==1||a[i]==2&&b[i]==4||a[i]==3&&b[i]==2||a[i]==3&&b[i]==4||a[i]==4&&b[i]==0||a[i]==4&&b[i]==1) wa++; 
            if(b[i]==0&&a[i]==2||b[i]==0&&a[i]==3||b[i]==1&&a[i]==0||b[i]==1&&a[i]==3||b[i]==2&&a[i]==1||b[i]==2&&a[i]==4||b[i]==3&&a[i]==2||b[i]==3&&a[i]==4||b[i]==4&&a[i]==0||b[i]==4&&a[i]==1) wb++; 
        } 
        printf("%d %d\n",wa,wb);
    }
    return 0;
}

 

9.模拟手机键盘发短信

题目链接:http://acm.nyist.cf/problem/1350

 

#include<stdio.h>
#include<string.h>
int main(){
    char one[5]={'?','\'',',','.','!'};
    char two[6]={'C','a','b','c','A','B'};
    char three[6]={'F','d','e','f','D','E'};
    char four[6]={'I','g','h','i','G','H'};
    char five[6]={'L','j','k','l','J','K'};
    char six[6]={'O','m','n','o','M','N'};
    char seven[8]={'S','p','q','r','s','P','Q','R'};
    char eight[6]={'V','t','u','v','T','U'};
    char nine[8]={'Z','w','x','y','z','W','X','Y'};
    char c[10001];
    while(~scanf("%s",c)){
        int len=strlen(c);
        int sum=1;
        int i;
        for(i=0;i<len;i++){
            int sum=1;
            if(c[i]=='1'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",one[sum%5]);
            }
            if(c[i]=='2'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",two[sum%6]);
            }
            if(c[i]=='3'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",three[sum%6]);
            }
            if(c[i]=='4'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",four[sum%6]);
            }
            if(c[i]=='5'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",five[sum%6]);
            }
            if(c[i]=='6'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",six[sum%6]);
            }
            if(c[i]=='7'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",seven[sum%8]);
            }
            if(c[i]=='8'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",eight[sum%6]);
            }
            if(c[i]=='9'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                printf("%c",nine[sum%8]);
            }
            if(c[i]=='0'){
                for(int j=i;j<len;j++){
                    if(c[j]==c[j+1]){
                        sum++;
                        i=j;
                    }else{
                        i=j;
                        break;
                    }
                }
                for(int k=0;k<sum-1;k++){
                    printf(" ");
                }
            }
        }
        printf("\n");
        
    }
    return 0;
} 

 

10.下任市长(简单模拟)

题目链接:http://acm.nyist.cf/problem/1362

这道题难度不高,主要在于翻译是否准确,能否了解题意。

需要注意的还有数组循环的处理

题目大意:多组测试样例,输入两个数字n和p(n代表候选人数,包括本届市长,p代表鹅卵石的个数),一张圆桌,候选人以逆时针的方向围坐,桌上有一只碗,碗里面有p个鹅卵石,本届市长的位置为0,其后为1,2,3......n-1,从0位置开始每人从碗里拿一个石子(如果碗里有石子的情况下),如果碗里没有石子了,而其他人手中仍有石子,你需要将你手中的石子全部放入碗中(如果你有的话),直到所有的石子全部到一个人手中,那个人就是下届市长,输出他的编号,结束。

#include<stdio.h>
#include<string.h>
int main(){
    int n,p;
    int cand[60];
    while(~scanf("%d%d",&n,&p)){
        if(n==0&&p==0) break;
        memset(cand,0,sizeof(cand));//初始化,每个人手中都没有石子
        int bowl=p;
        for(int i=0;i<n;i++){
            if(bowl>0){
                bowl--;
                cand[i]++;
            //    printf("cand[%d]:%d bowl:%d\n",i,cand[i],bowl);
            }else{
                if(cand[i]==p){
                //    printf("what is wrone?\n");
                    printf("%d\n",i);
                    break;
                }
                else{
                    bowl=cand[i];
                    cand[i]=0;
                }
            }
            if(i==n-1) i=-1;//循环
        } 
    }
    return 0;
} 

 

 11.计划日(经典日期问题)

题目链接:http://acm.nyist.cf/problem/1363

日期问题我觉得刚开始我是比较害怕做这样的题的,估计以后多练就好了。

#include<cstdio>//提交用c++,用c会报编译错误,我怀疑是bool函数的原因 
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};//平闰年每月天数
bool isLeap(int year){
    return ((year%4==0&&year%100!=0)||(year%400==0));
} 
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int time,y,m,d;
        int time2;
        int w,n;
        scanf("%d%d%d",&time,&w,&n);
        y=time/10000;
        m=(time%10000)/100;
        d=time%100;
        while(n>0){
            d++;
            if(d==month[m][isLeap(y)]+1){
                m++;
                d=1;
            }
            if(m==13){
                y++;
                m=1;
            }
            w++;
            if(w==8){
                w=1;
            }
            n--;
        }
        time2=d+m*100+y*10000;
        //printf("%d%d%d %d",y,m,d,w);刚开始是以这种方式输出,程序总是出错。所以改为下面这种输出方式。 
         printf("%d %d\n",time2,w);
    }
    return 0;
}

 

12.闪电大小(图形问题)

题目链接:http://acm.nyist.cf/problem/1384

图形问题是我以前比较讨厌的一种题,刚开始三角形都不会输出,主要是以前思路没有打开

这题解题思路是将闪电分为三个部分使用for循环输出

#include<stdio.h>
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            for(int j=0;j<n-i;j++){
                printf(" ");
            }
            printf("*");
            printf("\n");
        }
        for(int i=0;i<n+1;i++){
            printf("*");
        }
        printf("\n");
        for(int i=0;i<n;i++){
            for(int j=0;j<n-i-1;j++){
                printf(" ");
            }
            printf("*");
            printf("\n");
        }
        printf("\n");
    }
} 

 

13.再见手机键盘问题

这题超级简单

#include<stdio.h>
#include<string.h>
int main(){
    int n;
    char c[1001]; 
    scanf("%d",&n);
    while(n--){
        scanf("%s",c);
        int len=strlen(c);
        for(int i=0;i<len;i++){
            if(c[i]>='a'&&c[i]<='c') printf("2");
            if(c[i]>='d'&&c[i]<='f') printf("3");
            if(c[i]>='g'&&c[i]<='i') printf("4");
            if(c[i]>='j'&&c[i]<='l') printf("5");
            if(c[i]>='m'&&c[i]<='o') printf("6");
            if(c[i]>='p'&&c[i]<='s') printf("7");
            if(c[i]>='t'&&c[i]<='v') printf("8");
            if(c[i]>='w'&&c[i]<='z') printf("9");
        }
        printf("\n");
    }
} 

 

14.3n+1猜想(简单模拟)

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805325918486528

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    int step=0;
    while(n!=1){
        if(n%2==0){
            n=n/2;
        }else{
            n=(3*n+1)/2;
        }
        step++;
    }
    printf("%d\n",step);
} 

 

15.挖掘机技术哪家强

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805289432236032

#include<cstdio>
const int maxn = 100010;
int school[maxn] = {0};
int main(){
    int n,id,score;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d",&id,&score);
        school[id]+=score;
    }
    int k=1,MAX=-1;
    for(int i=1;i<=n;i++){//这里一定要注意,id是有可能等于n的 
        if(school[i]>MAX){
            MAX=school[i];
            k=i;
        }
    }
    printf("%d %d\n",k,MAX);
    return 0;
}

 

16.跟奥巴马一起学编程

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805285812551680

#include<stdio.h>
int main(){
    int n;
    char c;
    int h;
    scanf("%d",&n);
    getchar();
    scanf("%c",&c);
    if(n%2==0){
        h=n/2;
    }else{
        h=n/2+1;
    }//四舍五入
    for(int i=0;i<n;i++){
        printf("%c",c);
    } 
    printf("\n");
    for(int i=0;i<h-2;i++){
        printf("%c",c);
        for(int j=0;j<n-2;j++){
            printf(" ");
        }
        printf("%c\n",c);
    }
    for(int i=0;i<n;i++){
        printf("%c",c);
    }
    return 0;
}

 

17.计算日期差值

codeup网站最近故障,所以题目链接和截图就没了,我简单描述一下本题的意思:

有多组测试数据,分别为两个日期,格式为YYYYMMDD,计算两个日期相差的天数

#include<cstdio>
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},
                {31,31},{30,30},{31,31},{30,30},{31,31}};
bool isLeap(int year){
    return ((year%4==0)&&(year%100!=0))||(year%400)==0;
}
int main(){
    int time1,y1,m1,d1;
    int time2,y2,m2,d2;
    while(~scanf("%d%d",&time1,&time2)){
        if(time1>time2){
            int temp;
            temp=time1;
            time1=time2;
            time2=temp;
        }
        y1=time1/10000,m1=time1%10000/100,d1=time1%100;
        y2=time2/10000,m2=time2%10000/100,d2=time2%100;
        int count=1;
        while(y1!=y2||m1!=m2||d1!=d2){
            d1++;
            if(d1==month[m1][isLeap(y1)]+1){
                m1++;
                d1=1;
            }
            if(m1==13){
                y1++;
                m1=1;
            }
            count++;
        }
        printf("%d\n",count);
    }
    return 0;
}

 

18.换个格式输出整数

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805318855278592

#include<stdio.h>
#include<string.h>
int main(){
    int n;
    scanf("%d",&n);
    if(n>=0&&n<=9){
        for(int i=1;i<=n;i++){
            printf("%d",i);
        }
        printf("\n");
    }
    if(n>=10&&n<=99){
        for(int i=1;i<=n/10;i++){
            printf("S");
        }
        for(int i=1;i<=n%10;i++){
            printf("%d",i);
        }
        printf("\n");
    }
    if(n>=100&&n<=999){
        for(int i=1;i<=n/100;i++){
            printf("B");
        }
        for(int i=1;i<=n%100/10;i++){
            printf("S");
        }
        for(int i=1;i<=n%10;i++){
            printf("%d",i);
        }
        printf("\n");
    }
    return 0;
}

 

19.进制转换

我讨厌进制转换!我讨厌进制转换!我讨厌进制转换!

今天晚上就搞这一道题了,做完收工,哈哈。进制转换是我不喜欢的一道题,跟计算机相关的考试好像很多都会牵涉到这个问题,谁让计算机是01组成的呢。

 

对一个 P 进制的数,如果想要转换为 Q 进制,需要分两步:

① 将 P 进制数 X 转换为 十进制 数 y。

#include<stdio.h>
int main(){
    int P;//P进制
    int x;//P进制数 x
    int y=0;//P进制数 x 转换为 十进制数 y
    int product=1;//product在循环中会不断乘P,得到1,P,P^2,P^3......
    scanf("%d%d",&P,&x);
    while(x!=0){
        y=y+(x%10)*product;
        x=x/10;
        product=product*P;
    }
    printf("%d\n",y);
    return 0;     
}

②将 十进制数 y 转换为 Q 进制数 z。

#include<stdio.h>
int main(){
    int y;//十进制的y 
    int Q;//Q进制 
    int z[40];//数组z存放Q进制数y的每一位 
    int num=0;//num为位数
    scanf("%d%d",&y,&Q);
    do{
        z[num++]=y%Q;
        y=y/Q;
    } while(y!=0);
    for(int i=num-1;i>=0;i--){
        printf("%d",z[i]);
    }
    return 0;     
} 

 例题:D进制的A+B

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805299301433344

#include<stdio.h>
int main(){
    int A,B,y;
    int D;
    int z[40];
    int num=0;
    scanf("%d%d%d",&A,&B,&D);
    y=A+B;//十进制数y 
    do{
        z[num++]=y%D;
        y=y/D;
    } while(y!=0);
    for(int i=num-1;i>=0;i--){
        printf("%d",z[i]);
    }
    return 0;     
} 

 

20.判断回文字符串

#include<stdio.h>
#include<string.h>
int main(){
    char str[1000];
    scanf("%s",str);
    int len=strlen(str);
    int i=0;
    int j=len-1;
    while(i<=j){
        if(str[i]==str[j]){
            i++;
            j--;
        }
        else{
            printf("NO\n");
            break;
        }
    }
    if(i>j){
        printf("YES\n");
    } 
    return 0;
} 

 

21.说反话(二维字符数组的应用)

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805314941992960

单点测试:(while不会自动结束,需要按ctrl+Z)

#include<stdio.h>
#include<string.h>
char str[90][90];
int main(){
    int ans=0;
    while(~scanf("%s",str[ans])){
        ans++;
    } 
    for(int i=ans-1;i>=0;i--){
        printf("%s",str[i]);
        if(i>0) printf(" ");
    }
    return 0;
} 

多点测试:

#include<stdio.h>
#include<string.h>
int main(){
    char str[90];
    gets(str);
    int len=strlen(str);
    int r=0,h=0;//行和列
    char ans[90][90];
    for(int i=0;i<len;i++){
        if(str[i]!=' '){
            ans[r][h++]=str[i];//单词存储中...... 
        }else{
            ans[r][h]='\0';//一个单词存储完毕
            r++;//开始存储下一个;
            h=0; 
        }
    } 
    for(int i=r;i>=0;i--){
        printf("%s",ans[i]);
        if(i>0) printf(" ");
    } 
    return 0;
} 

 

22.我要通过(PATB1003)

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192

额~题目相当晦涩难懂,我简单描述一下吧

1.字符串中只能包含‘P’,‘A’,‘T’这三种字符

2.只能有一个‘P’和一个‘T’,P一定在T之前,且P和T之间一定有A

3.P之前的A的个数 * P和T之间A的个数 = T之后A的个数

同时满足以上三个条件,输出YES,否则输出NO

思路参考:https://blog.csdn.net/whl_program/article/details/76652890

#include<stdio.h>
#include<string.h>
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        char s[110];
        scanf("%s",s);
        int len=strlen(s);
        int num_a=0;
        int p,t;
        for(int i=0;i<len;i++){
            if(s[i]=='A')
                num_a++;
            if(s[i]=='P')
                p=i;
            if(s[i]=='T')
                t=i;
        }
        int flag=1;
        if(num_a!=len-2) flag=-1;
        if(p>t||t==p+1) flag=-1;
        if((p*(t-p-1)) != (len-1-t)) flag=-1;
        if(flag==1){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }
    return 0;
}

 

23.字符串拼接去重(PAT B1093)

解题思路:

1.字符串拼接

2.用一个int数组记录字母是否输出过,达到去重效果

字符串拼接方法(上一篇-语言篇中有介绍):

#include<stdio.h>
#include<string.h>
char stra[3000000];
char strb[1000010];
int c[1000];
int main(){
    for(int i=0;i<500;i++){
        c[i]=0;
    }
    gets(stra);
    gets(strb);
    strcat(stra,strb);    
    int len=strlen(stra);
    for(int i=0;i<len;i++){
        int k=stra[i];
        if(c[k]==0){
            putchar(stra[i]);
            c[k]=1;
        }
    }
    printf("\n");
    return 0;
} 

 

今后有合适的题目我还会持续更新本帖,欢迎大家学习交流。

推荐阅读