时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:3803
解决:1526
二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:
1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
3. 左、右子树本身也是一颗二叉排序树。
现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。
输入包含多组测试数据,每组测试数据两行。
第一行,一个数字N(N<=100),表示待插入的节点数。
第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过10^8。
输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值。
5 2 5 1 3 4
-1 2 2 5 3
#include<iostream> #include<cstdio> using namespace std; struct node { node *lchild; node *rchild; int val; }*root; void dfs(node *p,int tmp) { if(tmp<p->val) { if(p->lchild) dfs(p->lchild,tmp); else { node *t = new node; t->lchild=NULL; t->rchild=NULL; t->val=tmp; p->lchild=t; printf("%d\n",p->val); //printf("lchild %d\n",p->lchild->val); return; } } if(tmp>p->val) { if(p->rchild) dfs(p->rchild,tmp); else { node *t = new node; t->lchild=NULL; t->rchild=NULL; t->val=tmp; p->rchild=t; printf("%d\n",p->val); //printf("rchild %d\n",p->rchild->val); return; } } } int main() { int n,tmp,i; while(~scanf("%d",&n)) { scanf("%d",&tmp); node *t = new node; t->lchild=NULL; t->rchild=NULL; t->val=tmp; root=t; printf("-1\n"); for(i=1; i<n; i++) { scanf("%d",&tmp); dfs(root,tmp); } } return 0; } /************************************************************** Problem: 1467 User: 奔跑的菜鸟 Language: C++ Result: Accepted Time:10 ms Memory:1520 kb ****************************************************************/
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:8654
解决:2395
大家都知道,数据在计算机里中存储是以二进制的形式存储的。
有一天,小明学了C语言之后,他想知道一个类型为unsigned int 类型的数字,存储在计算机中的二进制串是什么样子的。
你能帮帮小明吗?并且,小明不想要二进制串中前面的没有意义的0串,即要去掉前导0。
第一行,一个数字T(T<=1000),表示下面要求的数字的个数。
接下来有T行,每行有一个数字n(0<=n<=10^8),表示要求的二进制串。
输出共T行。每行输出求得的二进制串。
5 23 535 2624 56275 989835
10111 1000010111 101001000000 1101101111010011 11110001101010001011
#include<iostream> #include<cstdio> using namespace std; int a[10005]; int main() { int n,i,p,len; while(~scanf("%d",&n)) { while(n--) { len=0; scanf("%d",&p); if(p==0) { printf("0\n"); continue; } while(p) { a[len++]=p&1; p>>=1; } for(i=len-1;i>=0;i--) printf("%d",a[i]); printf("\n"); } } return 0; } /************************************************************** Problem: 1473 User: 奔跑的菜鸟 Language: C++ Result: Accepted Time:0 ms Memory:1556 kb ****************************************************************/
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:4147
解决:1633
给定一个n*n的矩阵,求该矩阵的k次幂,即P^k。
输入包含多组测试数据。
数据的第一行为一个整数T(0<T<=10),表示要求矩阵的个数。
接下来有T组测试数据,每组数据格式如下:
第一行:两个整数n(2<=n<=10)、k(1<=k<=5),两个数字之间用一个空格隔开,含义如上所示。
接下来有n行,每行n个正整数,其中,第i行第j个整数表示矩阵中第i行第j列的矩阵元素Pij且(0<=Pij<=10)。另外,数据保证最后结果不会超过10^8。
对于每组测试数据,输出其结果。格式为:
n行n列个整数,每行数之间用空格隔开,注意,每行最后一个数后面不应该有多余的空格。
3 2 2 9 8 9 3 3 3 4 8 4 9 3 0 3 5 7 5 2 4 0 3 0 1 0 0 5 8 5 8 9 8 5 3 9 6 1 7 8 7 2 5 7 3
153 96 108 81 1216 1248 708 1089 927 504 1161 1151 739 47 29 41 22 16 147 103 73 116 94 162 108 153 168 126 163 67 112 158 122 152 93 93 111 97
#include<iostream> #include<cstring> using namespace std; int n; int a[15][15]; int b[15][15]; int tmp[15][15]; void fun() { int i,j,k; memset(tmp,0,sizeof(tmp)); for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(k=0;k<n;k++) { tmp[i][j]+=b[i][k]*a[k][j]; } } } for(i=0;i<n;i++) for(j=0;j<n;j++) b[i][j]=tmp[i][j]; } int main() { int tes,i,j,k; cin>>tes; while(tes--) { cin>>n>>k; for(i=0;i<n;i++) for(j=0;j<n;j++) { cin>>a[i][j]; b[i][j]=a[i][j]; } k--; while(k--) fun(); for(i=0;i<n;i++) { cout<<b[i][0]; for(j=1;j<n;j++) { cout<<" "<<b[i][j]; } cout<<endl; } } return 0; } /************************************************************** Problem: 1474 User: 奔跑的菜鸟 Language: C++ Result: Accepted Time:10 ms Memory:1520 kb ****************************************************************/
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:4439
解决:612
我们都学习过计算机网络,知道网络层IP协议数据包的头部格式如下:
其中IHL表示IP头的长度,单位是4字节;总长表示整个数据包的长度,单位是1字节。
传输层的TCP协议数据段的头部格式如下:
头部长度单位为4字节。
你的任务是,简要分析输入数据中的若干个TCP数据段的头部。 详细要求请见输入输出部分的说明。
第一行为一个整数T,代表测试数据的组数。
以下有T行,每行都是一个TCP数据包的头部分,字节用16进制表示,以空格隔开。数据保证字节之间仅有一个空格,且行首行尾没有多余的空白字符。
保证输入数据都是合法的。
对于每个TCP数据包,输出如下信息:
Case #x,x是当前测试数据的序号,从1开始。
Total length = L bytes,L是整个IP数据包的长度,单位是1字节。
Source = xxx.xxx.xxx.xxx,用点分十进制输出源IP地址。输入数据中不存在IPV6数据分组。
Destination = xxx.xxx.xxx.xxx,用点分十进制输出源IP地址。输入数据中不存在IPV6数据分组。
Source Port = sp,sp是源端口号。
Destination Port = dp,dp是目标端口号。
对于每个TCP数据包,最后输出一个多余的空白行。
具体格式参见样例。
请注意,输出的信息中,所有的空格、大小写、点符号、换行均要与样例格式保持一致,并且不要在任何数字前输出多余的前导0,也不要输出任何不必要的空白字符。
2 45 00 00 34 7a 67 40 00 40 06 63 5a 0a cd 0a f4 7d 38 ca 09 cd f6 00 50 b4 d7 ae 1c 9b cf f2 40 80 10 ff 3d fd d0 00 00 01 01 08 0a 32 53 7d fb 5e 49 4e c8 45 00 00 c6 56 5a 40 00 34 06 e0 45 cb d0 2e 01 0a cd 0a f4 00 50 ce 61 e1 e9 b9 ee 47 c7 37 34 80 18 00 b5 81 8f 00 00 01 01 08 0a 88 24 fa c6 32 63 cd 8d
Case #1 Total length = 52 bytes Source = 10.205.10.244 Destination = 125.56.202.9 Source Port = 52726 Destination Port = 80 Case #2 Total length = 198 bytes Source = 203.208.46.1 Destination = 10.205.10.244 Source Port = 80 Destination Port = 52833
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int tl; int s[4]; int d[4]; int sp; int dp; char str[2]; int toint(char x) { if(x>='0'&&x<='9') return x-'0'; else return x-'a'+10; } int main() { int tes,i,j; cin>>tes; for(int cas=1;cas<=tes;cas++) { tl=0; s[0]=s[1]=s[2]=s[3]=0; d[0]=d[1]=d[2]=d[3]=0; sp=dp=0; cin>>str; int len1=toint(str[1])*4; cin>>str; for(i=3;i<=4;i++) { cin>>str; for(j=0;j<2;j++) tl=tl*16+toint(str[j]); } for(i=5;i<=12;i++) cin>>str; for(i=13;i<=16;i++) { cin>>str; for(j=0;j<2;j++) { s[i-13]=s[i-13]*16+toint(str[j]); } } for(i=17;i<=20;i++) { cin>>str; for(j=0;j<2;j++) { d[i-17]=d[i-17]*16+toint(str[j]); } } for(i=21;i<=len1;i++) cin>>str; for(i=len1+1;i<=len1+2;i++) { cin>>str; for(j=0;j<2;j++) sp=sp*16+toint(str[j]); } for(i=len1+3;i<=len1+4;i++) { cin>>str; for(j=0;j<2;j++) dp=dp*16+toint(str[j]); } for(i=len1+5;i<=len1+12;i++) cin>>str; cin>>str; int len2 = toint(str[0])*4; for(i=len1+14;i<=len1+len2;i++) cin>>str; printf("Case #%d\n",cas); printf("Total length = %d bytes\n",tl); printf("Source = %d.%d.%d.%d\n",s[0],s[1],s[2],s[3]); printf("Destination = %d.%d.%d.%d\n",d[0],d[1],d[2],d[3]); printf("Source Port = %d\n",sp); printf("Destination Port = %d\n\n",dp); } return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN 1000 int change_tint(char *str, int begin, int num) { int i; char *temp = (char *)malloc(sizeof(char) * (num + 1)); for(i = 0; i < num; i ++) { temp[i] = str[begin + i]; } temp[i] = '\0'; return strtol(temp, NULL, 16); } void ip_field(char *str, int begin, int num) { int i, flag, ip; for (i = 0, flag = 1; i < num; i += 2) { ip = change_tint(str, begin + i, 2); printf("%d", ip); if (flag <= 3) { printf("."); flag ++; } } printf("\n"); } int main() { int index, i, j, n, length, ihl; char ipstr[LEN], temp[LEN]; while (scanf("%d\n", &n) != EOF) { if (n != 0) { for (index = 1; index <= n; index ++) { memset(ipstr, 0, sizeof(ipstr)); memset(temp, 0, sizeof(temp)); gets(temp); // 去除空格 for (i = j = 0, length = strlen(temp); i < length; i ++) { if (temp[i] != ' ') { ipstr[j ++] = temp[i]; } } ipstr[j] = '\0'; // 当前测试数据的序号 printf("Case #%d\n", index); // 整个ip数据包的长度 length = change_tint(ipstr, 4, 4); printf("Total length = %d bytes\n", length); // 源ip地址和目的ip地址 printf("Source = "); ip_field(ipstr, 24, 8); printf("Destination = "); ip_field(ipstr, 32, 8); // 源端口号和目的端口号 ihl = change_tint(ipstr, 1, 1) * 4 * 2; printf("Source Port = %d\n", change_tint(ipstr, ihl, 4)); printf("Destination Port = %d\n", change_tint(ipstr, ihl + 4, 4)); printf("\n"); } } } return 0; }