C语言学习笔记(十)---又是一些刷题记录

最近受漂亮小姐姐的鼓舞,突然有了一点刷题的热情,于是做了五道题来增强自信。
同时安利南阳理工oj,问题分类还有难度标识,甚至有根据水平智能屏蔽简单题的功能,着实人性好用。

1.A+B Problem(难度0)

这道题不需要题解,就是凑个数。

2.括号配对问题(难度3)

这道题一开始想简单了,以为就是简单的看前括号和后括号数量是不是一样,但仔细看了看样例,眉头一皱,发现问题没这么简单。这道题我的算法很水,但初学者或许可以借鉴一下。
首先考虑如果要配对,前后括号总数肯定一样,而且两种前括号加起来最多有5000个,多了肯定配对不了。
其次考虑到需连续的前后括号需要是同一种类型,于是认为应该是栈的相关操作。
于是得到解题思路:定义一个容量为5000的char数组做栈,遇到前括号就入栈,遇到后括号判断是否配对,配对就将对应的前括号出栈,否则记录该组数据结果为No。最后判断如果栈内已空且过程中没有记录结果为No,则结果为Yes。

//
//  NYOJ2
//
//  Created by passer_by_a on 2017/11/16.
//
#include <stdio.h>
char c1[5000]={0};
int main() {
    int n,k;
    scanf("%d",&n);
    getchar();
    for(k=1;k<=n;k++)
    {
        int i=0,p=0;
        for(;;)
        {
            char ch=getchar();
            if(ch=='\n') break;
            switch(ch)
            {
                case '[':c1[i++]=ch;break;
                case '(':c1[i++]=ch;break;
                case ']':if(c1[i-1]=='[') i--;else p=1;break;
                case ')':if(c1[i-1]=='(') i--;else p=1;break;
            }
        }
        if(i!=0||p==1) printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}

4.ASCII码排序(难度2)

中间第3题难度为4,不想打击自己,直接跳过。
这道题就是简单的排序,和三个数字排序没有什么不同。坑点在有好几组数据且以回车分隔,需要注意最后回车的归属问题。

//
//  NYOJ4
//
//  Created by passer_by_a on 2017/11/16.
//
#include<stdio.h>
char a[4]={0};
void paixu()//排序函数
{
    char p;
    int i,j;
    for(i=1;i<=2;i++)
    {
        for(j=1;j<=3-i;j++)
        {
            if(a[j]>a[j+1])
            {
                p=a[j];
                a[j]=a[j+1];
                a[j+1]=p;
            }
        }
    }
}
int main()
{
    int n,i,j;
    scanf("%d",&n);
    getchar();//接收回车
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=3;j++)
        {
            scanf("%c",&a[j]);
        }
        getchar();//接收回车
        paixu();
        for(j=1;j<=3;j++)
        {
            printf("%c ",a[j]);
        }
    }   
    return 0;
}

5.Binary String Matching(难度3)

简单的字符串匹配题,思路就是分别记录两个字符串,从第二个字符串开头开始遍历,当遇到与第一个字符串开头的字符相同的字符时,进行一轮比较。

//
//  NYOJ5
//
//  Created by passer_by_a on 2017/11/16.
//
#include <stdio.h>
int main() {
    int n;
    scanf("%d",&n);
    getchar();//get '\n'
    for(int i=1;i<=n;i++)
    {
        int ans=0;
        char a1[11]={0};
        char a2[1001]={0};
        int l1,l2;//the length of two string
        for(int j=0;;j++)
        {
            a1[j]=getchar();
            l1=j;
            if(a1[j]=='\n') break;
        }
        for(int j=0;;j++)
        {
            a2[j]=getchar();
            l2=j;
            if(a2[j]=='\n') break;
        }
        for(int j=0;j<l2;j++)
        {
            if(a2[j]==a1[0])//compare
            {
                for(int k=0,o=j;k<=l1;k++,o++)
                {
                    if(k<l1&&a2[o]!=a1[k]) break;
                    if(k==l1) ans++;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

6.喷水装置(一)(难度3)

这道题我一开始以为要动态规划,吓了一跳,后来仔细一想,只需要考虑半径为Ri的圆能完全覆盖宽度为2的长方形多长就行了,然后贪心一把,从大的取到长度达到20即可得到答案。

//
//  NYOJ6
//
//  Created by passer_by_a on 2017/11/16.
//
#include <stdio.h>
#include <math.h>
double Change(double y)//把半径改为更实际的值
{
    double h;
    y=pow(y, 2);
    h=sqrt(y-1);
    return h;
}
void paixu(double *s,int length)//排一下序,方便贪心
{
    *s++;
    double t;
    for(int i=1;i<=length;i++)
    {
        for(int j=0;j<length-i;j++)
        {
            if(*(s+j)<*(s+j+1))
            {
                t=*(s+j);
                *(s+j)=*(s+j+1);
                *(s+j+1)=t;
            }
        }
    }
}
int main() {
    int n;
    scanf("%d",&n);
    getchar();
    for(int i=1;i<=n;i++)
    {
        double slt[601]={0};
        double *s=slt;
        int m;
        scanf("%d",&m);
        for(int j=1;j<=m;j++)
        {
            scanf("%lf",&slt[j]);
            slt[j]=Change(slt[j]); 
        }
        paixu(s,m);
        int ans=0;
        double l=0;
        for(int j=1;j<=m;j++)//开始贪心
        {
            l+=2*slt[j];
            ans+=1;
            if(l>=20) break;
        }
        printf("%d\n",ans);
    }
    return 0;
}

(๑˙ー˙๑)

C语言学习笔记系列有十篇了!!!
撒花撒花~~~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值