您的位置:首页 > 编程语言 > C语言/C++

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

2017-11-17 00:47 302 查看
最近受漂亮小姐姐的鼓舞,突然有了一点刷题的热情,于是做了五道题来增强自信。

同时安利南阳理工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;
fo
b4e1
r(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语言学习笔记系列有十篇了!!!

撒花撒花~~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: