P4715 【深基16.例1】淘汰赛
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int x,a[1000],minn=0,y,minm=0,z,n;
cin>>x;
n=pow(2,x);
for(int i=1;i<=n;i++){
cin>>a[i];}
for(int i=1;i<=n/2;i++){
if(a[i]>minn){
minn=a[i];
y=i;}}
for(int i=n/2+1;i<=n;i++){
if(a[i]>minm){
minm=a[i];
z=i;}}
if(minn>minm)cout<<z;
if(minn<minm)cout<<y;
return 0;
}
P4913 【深基16.例3】二叉树深度
#include<iostream>
using namespace std;
struct sb{
int z,y;}a[1000010];
int maxx=0;
void cf(int x,int s){
if(x==0) return;
maxx=max(maxx,s);
cf(a[x].z,s+1);
cf(a[x].y,s+1);}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].z>>a[i].y;}
cf(1,1);
cout<<maxx;
return 0;
}
P1827 [USACO3.4] 美国血统 American Heritage
#include<iostream>
#include<cstring>
using namespace std;
void dfs(string s1,string s2){
char root=s2[0];
int l=s1.find(root),r=s1.size()-l-1;
if(l!=0){
string s3=s1.substr(0,l),s4=s2.substr(1,l);
dfs(s3,s4);}
string s3=s1.substr(l+1,r),s4=s2.substr(l+1,r);
dfs(s3,s4);}
cout<<root;
}
int main(){
string s1,s2;
cin>>s1>>s2;
dfs(s1,s2);
return 0;
}
P5076 【深基16.例7】普通二叉树(简化版)
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,op,x,a[10010],z=1;
cin>>n;
for(int i=0;i<n;i++){
cin>>op>>x;
if(op==1)cout<<lower_bound(a+1,a+z,x)-a<<endl;
if(op==2)cout<<a[x]<<endl;
if(op==3){
int y=lower_bound(a+1,a+z,x)-a;
if(y==1)cout<<"−"<<2147483647<<endl;
else cout<<a[y-1]<<endl;
}
if(op==4){
int y=upper_bound(a+1,a+z,x)-a;
if(y==z)cout<<2147483647<<endl;
else cout<<a[y]<<endl;
}
if(op==5){
a[z]=x;
z++;
sort(a+1,a+z);
}
}
return 0;
}
P1364 医院设置
#include<bits/stdc++.h>
using namespace std;
struct node{
int left,right,father,value;
}t[110];
int n,sum,ans=INT_MAX,vis[110];
void dfs(int step,int pos){
sum+=step*t[pos].value;
int fa=t[pos].father,l=t[pos].left,r=t[pos].right;
if(fa!=0&&vis[fa]==0){
vis[fa]=1;
dfs(step+1,fa);
}
if(l!=0&&vis[l]==0){
vis[l]=1;
dfs(step+1,l);
}
if(r!=0&&vis[r]==0){
vis[r]=1;
dfs(step+1,r);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>t[i].value>>t[i].left>>t[i].right;
t[t[i].left].father=i;
t[t[i].right].father=i;
}
for(int i=1;i<=n;i++){
sum=0;
memset(vis,0,sizeof(vis));
vis[i]=1;
dfs(0,i);
ans=min(ans,sum);
}
cout<<ans;
return 0;
}
P1229 遍历问题
#include<iostream>
#include<cstring>
using namespace std;
int main(){
string s1,s2;
cin>>s1>>s2;
long long ans=1;
for(int i=0;i<=s1.length()-2;i++){
for(int j=0;j<=s2.length()-1;j++){
if(s1[i]==s2[j]){
if(s1[i+1]==s2[j-1]) ans*=2;
break;}}}
cout<<ans;
return 0;
}