C语言学习笔记(十)---又是一些刷题记录
2017-11-17 00:47
302 查看
最近受漂亮小姐姐的鼓舞,突然有了一点刷题的热情,于是做了五道题来增强自信。
同时安利南阳理工oj,问题分类还有难度标识,甚至有根据水平智能屏蔽简单题的功能,着实人性好用。
首先考虑如果要配对,前后括号总数肯定一样,而且两种前括号加起来最多有5000个,多了肯定配对不了。
其次考虑到需连续的前后括号需要是同一种类型,于是认为应该是栈的相关操作。
于是得到解题思路:定义一个容量为5000的char数组做栈,遇到前括号就入栈,遇到后括号判断是否配对,配对就将对应的前括号出栈,否则记录该组数据结果为No。最后判断如果栈内已空且过程中没有记录结果为No,则结果为Yes。
这道题就是简单的排序,和三个数字排序没有什么不同。坑点在有好几组数据且以回车分隔,需要注意最后回车的归属问题。
撒花撒花~~~~~~
同时安利南阳理工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语言学习笔记系列有十篇了!!!撒花撒花~~~~~~
相关文章推荐
- C语言学习笔记(七)---一些刷题记录
- Eclipse IDE 使用技巧 (Eclipse工作空间小技巧)(自己的一些学习笔记和心得,记录下来,备忘录和复习使用)
- 【C语言】学习笔记,持续记录
- Git学习笔记(主要是对一些命令进行记录。。)
- 学习笔记 android开发 一些函数记录
- 最近在学习云服务器,一些学习笔记记录下来,留着以后查看
- Linux学习杂的笔记---一些细节需要及时记录
- 最近的学习笔记,记录一些通俗易懂的学习类文章。更像是好资料参与索引。
- Unity学习笔记 一些小疑问解答记录
- sqlite学习笔记11:C语言中使用sqlite之删除记录
- 最近的学习笔记,记录一些通俗易懂的学习类文章。更像是好资料参与索引。
- 学习MySQL的一些记录笔记(1)10-28
- 学习MySQL的一些记录笔记(2)11-06
- Linux学习笔记--一些错误的记录
- 这里的文章主要是本人学习过程中的Trace,同时会记录一些学习笔记
- PHP7 学习笔记(二)PHP5.9 升级到PHP7 遇到的一些坑的记录(php-fpm 图解)
- 学习iOS笔记第一天的C语言学习记录
- C语言学习笔记---持续添加中
- SpringMvc学习-一些乱七八糟的记录
- 《一直以来伴随我的一些学习习惯》的记录