//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+剪枝