题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805064676261888
题意大概就是在一个小顶堆里面判断下 根节点,父子关系,兄弟关系
不过我感觉天梯赛的题麻烦在一些输入输出,存储的形式上。
我这里是用的普通数组存储,利用heap类的函数进行堆排序。
再利用二叉树的性质进行条件的判断
代码a了一半测试点,剩下的硬是看不出哪里有问题,字符和数字的分割相当麻烦,用的暴力==(值得反思)
#include<bits/stdc++.h> using namespace std; string s; int a[1100],n,m; bool cmp(int a,int b) { return a>b; } int find(int k) { int i; for(i=1;i<=n+1;i++) { if(a[i]==k) return i; } return 0; } void type1() { int t = 0; int i=0; bool sign = true; if(s[i]=='-') sign=false,i++; while(s[i]>='0'&&s[i]<='9'&&i<s.size()) { t=t*10+(s[i]-'0'); i++; } if(!sign) t=-t; if(t == a[1]) cout<<'T'<<endl; else cout<<'F'<<endl; } void type2() { int t1 = 0,t2 = 0; int i=0; bool sign=true,sign2=true; if(s[i]=='-') sign=false,i++; while(s[i]>='0'&&s[i]<='9'&&i<s.size()) { t1=t1*10+(s[i]-'0'); i++; } if(!sign) t1=-t1; while((s[i]<'0'||s[i]>'9')&&i<s.size()) i++; if(s[i-1]=='-') sign2=false; while(s[i]>='0'&&s[i]<='9'&&i<s.size()) { t2=t2*10+(s[i]-'0'); i++; } if(!sign2) t2=-t2; // cout<<t1<<' '<<t2<<endl; int ct1=find(t1); int ct2=find(t2); if(ct1/2==ct2/2) cout<<'T'<<endl; else cout<<'F'<<endl; } void type3() { int t1 = 0,t2 = 0; int i=0; bool sign=true,sign2=true; if(s[i]=='-') sign=false,i++; while(s[i]>='0'&&s[i]<='9'&&i<s.size()) { t1=t1*10+(s[i]-'0'); i++; } if(!sign) t1=-t1; while((s[i]<'0'||s[i]>'9')&&i<s.size()) i++; if(s[i-1]=='-') sign2=false; while(s[i]>='0'&&s[i]<='9'&&i<s.size()) { t2=t2*10+(s[i]-'0'); i++; } if(!sign2) t2=-t2; // cout<<t1<<' '<<t2<<endl; int ct1 = find(t1); int ct2 = find(t2); // cout<<ct1<<' '<<ct2<<endl; if(ct1==ct2/2) cout<<'T'<<endl; else cout<<'F'<<endl; } void type4() { int t1 = 0,t2 = 0; int i=0; bool sign=true,sign2=true; if(s[i]=='-') sign=false,i++; while(s[i]>='0'&&s[i]<='9'&&i<s.size()) { t1=t1*10+(s[i]-'0'); i++; } if(!sign) t1=-t1; while((s[i]<'0'||s[i]>'9')&&i<s.size()) i++; if(s[i-1]=='-') sign2=false; while(s[i]>='0'&&s[i]<='9'&&i<s.size()) { t2=t2*10+(s[i]-'0'); i++; } if(!sign2) t2=-t2; // cout<<t1<<' '<<t2<<endl; int ct1 = find(t1); int ct2 = find(t2); if(ct1/2==ct2) cout<<'T'<<endl; else cout<<'F'<<endl; } int main() { int i,j; cin>>n>>m; for(i=1;i<=n;i++) { cin>>a[i]; } make_heap(a+1,a+n+1,cmp);//默认大顶堆,修改成小顶堆 /* for(i=1;i<=n;i++) { cout<<a[i]<<' '; } cout<<endl;*/ cin.sync(); for(i=1;i<=m+1;i++)//天梯c++clang缓冲问题 { int typ=0; getline(cin,s); for(j=0;j<s.size();j++) { if(s[j]=='r'&&s[j+1]=='o'&&s[j+2]=='o'&&s[j+3]=='t') typ=1; else if(s[j]=='a'&&s[j+1]=='n'&&s[j+2]=='d') typ=2; else if(s[j]=='p'&&s[j+1]=='a'&&s[j+2]=='r'&&s[j+3]=='e'&&s[j+4]=='n'&&s[j+5]=='t') typ=3; else if(s[j]=='c'&&s[j+1]=='h'&&s[j+2]=='i'&&s[j+3]=='l'&&s[j+4]=='d') typ=4; } switch(typ) { case 1:type1();break; case 2:type2();break; case 3:type3();break; case 4:type4();break; } s.clear(); } }
然后是大佬的代码:
https://www.cnblogs.com/caiyishuai/p/13271101.html 在测试服务器上编译不通过,但是很巧妙的利用sscanf进行分割值得好好学习一下。
还有这个大佬
https://blog.csdn.net/cyh1069247088/article/details/86719749 学不来┭┮﹏┭┮
欣赏一下该大佬全部ac的优美代码
#include <bits/stdc++.h> using namespace std; bool is(int *a,int n) { int A,B,count=0; char C; scanf("%d %c",&A,&C); if(C=='a') { count=2; scanf("nd %d are siblings",&B); } else { scanf("s %c",&C); if(C=='a') { count=4; scanf(" child of %d",&B); } else { scanf("he %c",&C); if(C=='r') { scanf("oot"); count=1; } else { count=3; scanf("arent of %d",&B); } } } bool isOk=false; switch(count) { case 1: return A==a[0]; case 2: for(int i=0;i<n;i++) { if(a[i]==A) { if(i%2==1&&i+1<n&&a[i+1]==B) isOk=true; else if(i%2==0&&i-1>0&&a[i-1]==B) isOk=true; } } return isOk; case 3: for(int i=0;i<n;i++) { if(a[i]==B) { if(i%2==0&&i/2-1>=0&&a[i/2-1]==A) isOk=true; else if(i%2==1&&a[i/2]==A) isOk=true; } } return isOk; case 4: for(int i=0;i<n;i++) { if(a[i]==A) { if(i%2==0&&i/2-1>=0&&a[i/2-1]==B) isOk=true; else if(i%2==1&&a[i/2]==B) isOk=true; } } return isOk; } } void AdjustDown(int *a,int i,int n) { int j=2*i+1; while(j<n) { if(j+1<n&&a[j+1]<a[j]) j++; if(a[i]<a[j]) return; swap(a[i],a[j]); i=j; j=2*i+1; } } void AdjustHeap(int *a,int n) { for(int i=n/2-1;i>=0;i--) { AdjustDown(a,i,n); } } int main() { //freopen("in.txt","r",stdin); int n,m,a[1005]={0}; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%d",&a[i]); AdjustHeap(a,i+1); } while(m--) { if(is(a,n)) printf("T\n"); else printf("F\n"); } return 0; }