又是一天废物,白天屁事没干,晚上才写出来题目
#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到右,分别递归,构建出二叉树,再对二叉树进行后序遍历输出
#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;
}
和美国血统辣个题目相同思路,只是这个题目利用后序的字符串,从后往前搜索,建树也是先右节点再左节点,换个方向而已
#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]);
}
感觉这题跟树关系不大,还不如说是退化到一定程度的并查集
写计划就是用来鸽的,还不如不写(逃