L2-012. 关于堆的判断
2016-06-04 22:48
573 查看
L2-012. 关于堆的判断
题目链接:https://www.patest.cn/contests/gplt/L2-012终于ac了,简直要哭。题目还是很简单的,不过很多坑:
1.寻找x下标时,有可能返回0,即x是根结点;
2.字符串中字符的位置有可能会因串中的数字长度大小改变而改变(QAQ找了一个小时才发现是在这里);
3.gets(函数)会读取前一个分隔符(是我基础不好╮(╯▽╰)╭).
代码如下:
#include<cstdio> #include<iostream> using namespace std; int a[1005]; int location(int key){ int k=0; while(a[k]!=key)k++; return k; } int transint(char s[]){ if(s[0]=='-'){ int temp=0; for(int i=1;s[i]!=' '&&s[i]!='\0';i++) temp=temp*10+s[i]-'0'; return -temp; }else{ int temp=0; for(int i=0;s[i]!=' '&&s[i]!='\0';i++) temp=temp*10+s[i]-'0'; return temp; } } int main(void){ int n,m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ scanf("%d",a+i); int k=i; while(k&&a[k]<a[(k-1)/2]){ swap(a[k],a[(k-1)/2]); k=(k-1)/2; } } while(m--){ bool flag; char s[50]; int x; scanf("%d",&x); gets(s);//由于gets会读取x后的分隔符,所以字符串s实际上是从' '开始的 //一开始用s[8]区分,发现第二种查询会因数字长度改变而改变 if(s[4]=='t'&&s[8]=='r'){//第一种查询 if(a[0]==x)flag=1; else flag=0; }else if(s[4]==' '){//第二种查询 int y=transint(&s[5]); int t=location(x); if(t){ if(t&1){ if(a[t+1]==y)flag=1; else flag=0; }else{ if(a[t-1]==y)flag=1; else flag=0; } }else flag=0; }else if(s[4]=='t'&&s[8]=='p'){//第三种查询 int y=transint(&s[18]); int t=location(y); if(t&&a[(t-1)/2]==x)flag=1; else flag=0; }else if(s[4]=='a'){//第四种查询 int y=transint(&s[15]); int t=location(x); if(t&&a[(t-1)/2]==y)flag=1; else flag=0; } if(flag)printf("T\n"); else printf("F\n"); } return 0; }
相关文章推荐
- Bootstrap框架基础
- java 实现n个整数的全排列
- 在Android开发中如何避免内存泄露
- Dealloc 时取 weak self 时崩溃
- 通过实现Linux下的进度条引发的一系列问题
- 63. Unique Paths II
- 自定义HtmlHelper控件
- 别轻言放弃
- C语言之typedef
- 【备忘】C#语言基础-2
- 转 Python爬虫入门七之正则表达式
- ajax操作XML
- UNIX环境高级编程-第3章 文件I/O
- 删除字符串中出现次数最少的字符
- Myeclipse+oracle分页查询
- task_struct结构描述
- c++第7次实验-素数和回文
- OpenCV3.1开发系列-CMake编译OpenCV3.1及opencv_contrib
- 实习第十五天:如何在文件夹中打开DOS命令窗口
- Servlet基础