寒假总结 1-19

又是一天废物,白天屁事没干,晚上才写出来题目

Codeforces World Finals - 洛谷

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<malloc.h>
int dd,mm,yy;
int jbk(int a,int b,int c);
int main(){
	int bd,bm,by;
	scanf("%d.%d.%d%d.%d.%d",&dd,&mm,&yy,&bd,&bm,&by);
    if(jbk(bd,bm,by)||jbk(bd,by,bm)
     ||jbk(bm,bd,by)||jbk(bm,by,bd)
     ||jbk(by,bd,bm)||jbk(by,bm,bd)) //三个数字,六种组合
		printf("YES");
	else printf("NO");
	return 0;
}

int jbk(int a,int b,int c){//排序后
	int y=c+2000;
	if(b>12) return 0;
    //月份大于12
	if(a>31) return 0;
    //日期大于31
	if(a>30&&(b==4||b==6||b==9||b==11)) 
        return 0;//判断只有30天的月份
	if(a>29&&b==2) return 0;
    //二月最多29天
	if(a>28&&b==2&&y%4!=0) return 0;
    //是否为闰年
	
	if(yy-c>18) return 1;
	else if(yy-c==18&&mm-b>0) return 1;
	else if(yy-c==18&&mm-b==0&&dd-a>=0) 
        return 1;//可以在生日当天
	return 0;
	
}

[USACO3.4]美国血统 American Heritage - 洛谷

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>

typedef struct tree{
	char self;
	struct tree *lson,*rson;
}tree;

char zx[100],xx[100];
int l,id=0;
void add(int a,int b,tree *p);
void hxputtree(tree *p);
int main()
{
	scanf("%s",zx);scanf("%s",xx);
	tree *head=(tree*) malloc(sizeof(tree));
	head->lson=NULL;head->rson=NULL;
	head->self=xx[0];
	l=strlen(zx);
	add(0,l-1,head);
	hxputtree(head);
	return 0;
}

void add(int a,int b,tree *p){
	int tip=-1;
	for(int i=a;i<=b;i++){
		if(zx[i]==xx[id]){
			tip=i;break;
		}
	}
//	printf("%d\n%d %d \n",id,a,b);
	if(tip==-1) return;
	id++;
	p->self=zx[tip];
//	printf("%c\n",p->self);
	if(tip>a){
		tree *pl=(tree *) malloc(sizeof(tree));
		pl->lson=NULL;pl->rson=NULL;
		p->lson=pl;
		add(a,tip-1,pl);
	}
	if(tip<b){
		tree *pr=(tree *) malloc(sizeof(tree));
		pr->lson=NULL;pr->rson=NULL;
		p->rson=pr;
		add(tip+1,b,pr);
	}
}

void hxputtree(tree *p){
	if(p->lson!=NULL) hxputtree(p->lson);
	if(p->rson!=NULL) hxputtree(p->rson);
	printf("%c",p->self);
	return;
}

感觉是在用二分做

因为先序遍历“中左右”,而中序遍历“左中右”,则可以逐个比较先序遍历的字符在中序遍历的位置tip,增加该节点,在中序遍历的左l到tip-1,tip+1到右,分别递归,构建出二叉树,再对二叉树进行后序遍历输出

[NOIP2001 普及组] 求先序排列 - 洛谷 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>

typedef struct tree{
	char self;
	struct tree *lson,*rson;
}tree;

char zx[100],hx[100];
int l,id;
void add(int a,int b,tree *p);
void hxputtree(tree *p);
int main()
{
	scanf("%s",zx);scanf("%s",hx);
	l=strlen(zx);
	id=l-1;
	tree *head=(tree*) malloc(sizeof(tree));
	head->lson=NULL;head->rson=NULL;
	head->self=hx[l-1];
	add(0,l-1,head);
	hxputtree(head);
	return 0;
}

void add(int a,int b,tree *p){
	int tip=-1;
	for(int i=b;i>=a;i--){
		if(zx[i]==hx[id]){
			tip=i;break;
		}
	}
	//	printf("%d\n%d %d \n",id,a,b);
	if(tip==-1) return;
	id--;
	p->self=zx[tip];
	//	printf("%c\n",p->self);
	
	if(tip<b){
		tree *pr=(tree *) malloc(sizeof(tree));
		pr->lson=NULL;pr->rson=NULL;
		p->rson=pr;
		add(tip+1,b,pr);
	}
	if(tip>a){
		tree *pl=(tree *) malloc(sizeof(tree));
		pl->lson=NULL;pl->rson=NULL;
		p->lson=pl;
		add(a,tip-1,pl);
	}
	
}

void hxputtree(tree *p){
	printf("%c",p->self);
	if(p->lson!=NULL) hxputtree(p->lson);
	if(p->rson!=NULL) hxputtree(p->rson);
	return;
}

和美国血统辣个题目相同思路,只是这个题目利用后序的字符串,从后往前搜索,建树也是先右节点再左节点,换个方向而已

【深基16.例3】二叉树深度 - 洛谷

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>

int tree[1000005][2]={0};
int max=0;

void find(int id,int num);

int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&tree[i][0],&tree[i][1]);
	}
	find(1,1);
	printf("%d",max);
	return 0;
}

void find(int id,int num){
	if(id>max) max=id;
//	printf("%d %d\n",max,num);
	if(tree[num][0]>0) find(id+1,tree[num][0]);
	if(tree[num][1]>0) find(id+1,tree[num][1]);
	
}

感觉这题跟树关系不大,还不如说是退化到一定程度的并查集

写计划就是用来鸽的,还不如不写(逃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值