pat-树部分02

//1094
#include<bits/stdc++.h>
using namespace std;
vector<int> v[110];
int book[110] ;
int maxle=0;
void dfs(int root,int le){
	//end
	book[le]++;
	if(v[root].size()==0){
		if(le>maxle){
			maxle=le;
		}
		return;
	}
	for(int i=0;i<v[root].size();i++){
		dfs(v[root][i],le+1);
	}
} 
int main(){
	int n,m,_1,_2,_3;
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++){
		scanf("%d%d",&_1,&_2);
		for(int i=0;i<_2;i++){
			scanf("%d",&_3);
			v[_1].push_back(_3);
		}
	}
	dfs(1,1);
	int maxnum=0,ansle=0;
	for(int i=1;i<=maxle;i++){
		if(book[i]>maxnum){
			maxnum=book[i];
			ansle=i;
		}
	}
	printf("%d %d",maxnum,ansle);
	return 0;
}

#include<bits/stdc++.h>
using namespace std;
struct node{
	int key,index;
};
vector<int>v[110];
vector<node> ans;
vector<int>in;
int cnt=0;
void dfs(int root,int index){
	//end
	if(root==-1){
		return;
	}
	dfs(v[root][0],2*index+1);
	ans.push_back(node{in[cnt++],index} ) ;
	dfs(v[root][1],2*index+2);
}
bool cmp(node&a,node&b){
	return a.index<b.index;
}
int main(){
	int n,_1,_2;
	scanf("%d",&n);
    for(int i=0;i<n;i++){
    	scanf("%d%d",&_1,&_2);
    	v[i].push_back(_1);
    	v[i].push_back(_2);
	}
	int _3;
	for(int i=0;i<n;i++){
		scanf("%d",&_3);
		in.push_back(_3);
	}
	sort(in.begin(),in.end());//中序没sort 
	dfs(0,0);
	sort(ans.begin(),ans.end(),cmp);
	printf("%d",ans[0].key);
	for(int i=1;i<ans.size();i++){
		printf(" %d",ans[i].key);
	}
	return 0;
}
//1099

#include<bits/stdc++.h>
using namespace std;
struct node{
	int l,r,key;
};
int maxle=0;
vector<int> in;
vector<node> v(100);
vector<int>ans[110];//只用来存储过程中的索引 
int cnt=0;
void dfs(int root,int le){
	if(le>maxle){
		maxle=le;
	}
	if(v[root].l!=-1){
		dfs(v[root].l,le+1); 
	}
	v[root].key=in[cnt++];
	if(v[root].r!=-1){
		dfs(v[root].r,le+1); 
	}
}
int main(){
	int n,_1,_2;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d%d",&_1,&_2);
		//v.push_back({_1,_2});已经分配了空间不能在pushback 
	   v[i].l=_1;
	   v[i].r=_2;
	}
	int _3;
	for(int i=0;i<n;i++){
		scanf("%d",&_3);
		in.push_back(_3);
	}
	sort(in.begin(),in.end());
	dfs(0,0);
	ans[0].push_back(0);//第一个坐标代表层数 
	for(int i=0;i<=maxle;i++){
		for(int j=0;j<ans[i].size();j++){
			if(i!=0) printf(" ");
			printf("%d",v[ans[i][j]].key);
		
		if(v[ans[i][j]].l!=-1) ans[i+1].push_back(v[ans[i][j]].l);
		if(v[ans[i][j]].r!=-1) ans[i+1].push_back(v[ans[i][j]].r);//类似于队列 
	    }
	}
	return 0;
	
}
//1102

#include<bits/stdc++.h>
using namespace std;

vector<int> v[15];
struct node{
	int root,index;
};
vector<node> in;
int ex[15];
void dfs(int root,int index){
	if(root==-1){//已经是v[root][1]的值了不能是-1的v吧 
		return;
	}
	dfs(v[root][1],2*index+1);
	in.push_back(node{root,index});
	dfs(v[root][0],2*index+2);
}
bool cmp(node&a,node&b){
	return a.index<b.index;
}
int main(){
	int n;
	scanf("%d",&n);//值这里在缓冲区留下一个\n导致后面%c scanf输入错误,所以遇到有char型也要getchar() 
    getchar();
	for(int i=0;i<n;i++){
		char a,b;
		scanf("%c %c",&a,&b);//慎用char型注意回收"\n" 
		getchar();
	//	printf("\n");
	//	printf("****%c %c****",a,b);
		
		if(a=='-'){
			v[i].push_back(-1);
		}else{
			v[i].push_back(a-'0');//char型数字直接-'0'就可以转化为int 
			ex[a-'0' ]=1;//不能用to_string//将数值转化为字符串。返回对应的字符串。 
		}
		if(b=='-'){
			v[i].push_back(-1);
		}else{
			v[i].push_back(b-'0');
			ex[b-'0']=1;
		}
	}
	int i=0;
	while(ex[i]==1&&i<n) i++;
	
	dfs(i,0);
	vector<node> cg;
	cg=in;//vector 可以直接相等赋值 
	sort(cg.begin(),cg.end(),cmp);
	for(int i=0;i<cg.size();i++)
	{
	   if(i!=0) printf(" ");
	   printf("%d",cg[i]);
	}
	printf("\n");
	for(int i=0;i<in.size();i++)
	{
	   if(i!=0) printf(" ");
	   printf("%d",in[i]);
	}
	return 0;
	 
}
//pat-1103

#include<bits/stdc++.h>
using namespace std;
vector<int> ar;
int n,k,p;
void get(int n){
	for(int i=1;i<=n;i++){
		if(pow(i,p)<=n){
			ar.push_back(pow(i,p));
		}
	}
}
int flag=1;
vector<int> temp,ans;

void dfs(int index,int le){
	temp.push_back(ar[index] );
	//end
	if(le==k){
		int sum=0;
		for(int i=0;i<temp.size();i++){
			sum+=temp[i];
		}
		if(sum==n){
			ans=temp;
			flag=0;
		}
		temp.pop_back();
		return;
	}
	while(index>=0){
		int tempsum=0;
		for(int i=0;i<temp.size();i++){
			tempsum+=temp[i];
		}
	if(tempsum+ar[index] <n) 
	dfs(index,le+1);
	else{
		temp.pop_back();
		temp.push_back(ar[index-1]);
	} 
	if(flag==0) break;
	index--;
    }
    temp.pop_back();
}

int maxsumd=0;
void dfs(int index,int le,int tempsum){
		if(le==k){
		int sum=0;
		for(int i=0;i<temp.size();i++){
			sum+=temp[i];
		}
		int sumd=0;
		for(int i=0;i<temp.size();i++){
			sumd+=sqrt(temp[i]);
	    }
		if(sum==n){
			ans=temp;
			maxsumd=sumd;
			//flag=0;
		}
		//temp.pop_back();
		return;
	}
	while(index>=0){
		if(tempsum+ar[index]<=n){
		temp.push_back(ar[index]);
		dfs(index,le+1,tempsum+ar[index]);
	    temp.pop_back();//dfs后面紧跟pop 不要每次每入值就pop 
		}
	//	if(flag==0) break;//双等写成等于 
		//temp.pop_back();//过度pop在for换岔道口内是不需要pop的 
		index--;
	}
	//temp.pop_back();
}
int main(){
	scanf("%d%d%d",&n,&k,&p);
	get(n);
	dfs(ar.size()-1,0,0);//从0klui 
	if(ans.size()==0){
		printf("Impossible");
	}else{
		printf("%d = ",n);
		int _1=sqrt(ans[0]) ;
		printf("%d^%d",_1 ,p);//sqrt若输出只能为lf 
		for(int i=1;i<ans.size();i++){
		_1=sqrt(ans[i]) ;
		printf(" + %d^%d",_1,p);
		//printf("*%d",ans[i]);
		}
		
	}
	return 0;
}
//1106

#include<bits/stdc++.h>
using namespace std;
vector<int> v[100009];
double minn=1000000000;int num=0; //min初始值能设多大就设多大 
double p,r;
void dfs(int root,int le){
	//end
	if(v[root].size()==0){
		double temp=0;
		temp=p*pow(1+r/100,le);
		 
		if(temp<minn){
			minn=temp;
			num=1;
		}else if(temp==minn){
			num++;
		}
		return ;
	}
	for(int i=0;i<v[root].size();i++){
		dfs(v[root][i],le+1);
	}
}
int main(){
	int n,_1,_2;
	scanf("%d%lf%lf",&n,&p,&r);
	for(int i=0;i<n;i++){//for循环重名 
		scanf("%d",&_1);
		for(int j=0;j<_1;j++){//for 循环重名导致存储错误 
		scanf("%d",&_2);
		v[i].push_back(_2);
		}
		
	}
	dfs(0,0);
	printf("%.4lf %d",minn,num);
	return 0;
}
//1110

#include<bits/stdc++.h>//root 与index 未必相等   这种题不适合用vector 做 
using namespace std;
//vector<int>v[25];
int ex[25],maxindex=0,node=-1;
struct node{
	int id,index,ll,rr;
}a[25];
void dfs(int root,int index){
	//end
	/*if(root==-1) //已经是-1了就该结束 
	{  
	if(index>maxindex)
    maxindex=index;
   
	return;
     }*/
   if(index>maxindex){
    maxindex=index;
    node=root;
	}
    
if(a[root].ll!=-1)//防止-1时再标记 
dfs(a[root].ll,2*index);
if(a[root].rr!=-1)
dfs(a[root].rr,2*index+1);
}
int main(){
	fill(ex,ex+25,0);
	int n;//gf
	string  _1,_2;
	scanf("%d",&n);
	getchar();
	for(int i=0;i<n;i++){
		cin>>_1>>_2;
		getchar();
		if(_1=="-")
		a[i].ll=-1;
		else{
			//v[i].push_back(_1-'0');
			a[i].ll=stoi(_1);
			ex[stoi(_1)]=1;
			//cnt++;
		}
		if(_2=="-")
		//v[i].push_back(-1);
		a[i].rr=-1;//写错没改 
		else{
			//v[i].push_back(_2-'0');
			a[i].rr=stoi(_2);
			ex[stoi(_2)]=1;//复制过来没改全 
			//cnt++;
		}
	}
	int i=0;
	//debug
	/*for(int i=0;i<n;i++){
		printf(" %d",ex[i]);
	}
	printf("\n");*/
	while(ex[i]==1&&i<n)i++;
	dfs(i,1);
	if(n==maxindex){
		//printf("YES %d",cnt-1);//想当然root与index未必相同,index只是我们随便标的号,样例有可能骗你 
	printf("YES %d",node);
	}else{
		printf("NO %d",i);
	}
	return 0;
}

#include<bits/stdc++.h>
using namespace std;
struct node{
	int key;
	node*l;
	node*r;
};
void insert(node*&root,int data){
 //因为有new
if(root==NULL){
	root=new node;
	root->key=data;
	root->l=root->r=NULL;//用成双等 
	return ;//不可缺少  否则又会把它插一遍 
}
if(data<=root->key){//即使题干非常类似也要一行一行的看,这题就把细节处改了是<=在左子树 
	insert(root->l,data);
}else{
	insert(root->r,data);
}
}
int book[1009],maxle=0;
void dfs(node*root,int le){
if(le>maxle){
	maxle=le;
}
book[le]++;
if(root->l!=NULL) dfs(root->l,le+1);//加个冒防止为空影响记录 
if(root->r!=NULL) dfs(root->r,le+1);
}
int main(){
	int n,_1;
	scanf("%d",&n);
	node*root=NULL;
	for(int i=0;i<n;i++){
		scanf("%d",&_1);//忘加& 
		insert(root,_1);
	}
	dfs(root,0);
	printf("%d + %d = %d",book[maxle],book[maxle-1],book[maxle]+book[maxle-1]);
	return 0;
}
//pat-1119 
#include<bits/stdc++.h>
using namespace std;
vector<int> pre,post;
int flag=0;
vector<int> in;
void dfs(int root,int poll,int porr){
	//end
	if(poll>=porr) {//此时和原先划分情况不同,未必就是> 
//	if(poll==porr);//加了个;????? 
     if(poll==porr)
	 in.push_back(post[poll]);//当等于是也要输入最后一个元素 
	 return;
	 } 
	int i=poll;
	while(post[i]!=pre[root+1]&&i<porr) i++;//相等时 会导致本该正确的错误,题目已改变具体整么写应该根据清况带入看看 
	if(porr-i>1){
		dfs(root+1,poll,i);
		in.push_back(pre[root]);
		dfs(root+i-poll+2,i+1,porr-1);
	}else{
		flag=1;
		dfs(root+1,poll,i);
		in.push_back(pre[root]);
		dfs(root+i-poll+2,i+1,porr-1);
	}
	
}
int main(){
	int n,_1;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&_1);
		pre.push_back(_1);
	} 
	for(int i=0;i<n;i++){
		scanf("%d",&_1);
		post.push_back(_1);
	} 
	dfs(0,0,n-1);
	if(flag==1){
		printf("No\n");
	}else{
		printf("Yes\n");
	}
	printf("%d",in[0]);
	for(int i=1;i<in.size();i++){
		printf(" %d",in[i]);
	}
	printf("\n");
	return 0;
}

总结

8道比较难

需再刷1103  还没研究透dfs+剪枝

1119  划分的终止条件看看可不可以推广 1115bst插入序列

不熟题型   1102 1110

还有各种小错误哈哈,放平心态,很正常

问题  dfs+剪枝 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值