2011 计算机院(看了眼网研院感觉挺难的…时间有限后面就不做网研的了orz)
A 句子逆转
有做过类似的 PTA 1009
B 成绩管理
实现查询成绩的功能。首先输入T 表示有T 组数据。每组数据首先输入n,接下来有n 行输
入,每行输入是插入或者查找。插入为Insert id score。id 是自然数,不大于1000。每次插入
的id 都不同。score 是自然数,不大于100。查找为Find id。找到输出该id 与score。查找不
到输出No result!
SAMPLE:
INPUT:
2
2
Insert 0 10
Find 0
5
Insert 1 15
Find 1
Find 2
Insert 2 35
Find 2
Output:
name:0 score:10
name:1 score:15
No result!
name:2 score:35
1、思路:用结构体定义学生信息,注意输入n要放在while循环里,不然会出现不同组数据相互覆盖的问题。
2、源代码(用Codeblocks写的,格式化了一下,括号看着挺难受,虽然知道这是C的写法orz)
#include <iostream>
using namespace std;
struct Student
{
int id;
int score;
};
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
int cnt = 0;
string command;
int id,score;
while(cin >> n)
{
Student stu[n];
for(int i = 0 ; i < n ; i++)
{
cin >> command >> id;
if(command == "Insert") // 插入学生
{
cin >> score;
stu[cnt].id = id;
stu[cnt].score = score;
cnt++;
}
else if(command == "Find") // 查找学生
{
bool flag = false; // 找到的标志
for(int i = 0 ; i <= cnt ; i++)
{
if(id == stu[i].id) // 找到学生
{
flag = true;
cout << "name:" << i << " score:" << stu[i].score << endl;
}
}
if(!flag) // 没有找到
{
cout << "No result!" << endl;
}
}
}
}
}
return 0;
}
C 寻找宝藏
一棵多叉树 T,根结点为 0,某个结点上有宝藏。从根结点沿着树枝向下寻找,如果有分支,
沿各分支继续寻找是等概率的。计算找到宝藏的概率。首先输入 M,N,L。M 多叉树 T 的
结点数,结点分别为 0~M-1。N 和 L 分别是树枝数和宝藏所在结点。接下来有 N 行输入,
每行两个数,表示这两个结点之间有树枝连接。而且前一个结点比后一个更靠近根结点。输
出找到结点的概率,保留六位小数。
SAMPLE:
INPUT:
6 5 5
0 1
0 2
1 3
2 4
2 5
OUTPUT:
0.250000
HINT:
输出可用
printf("%.6f",a)
看了佬们的解答也没看懂……orz
2012 计算机院
Problem A.
二叉排序树
题目描述:
二叉排序树,也称二叉查找树。可以是一棵空树,也可以是一棵具有如下特性的非空二叉
树:
1.
若左子树非空,则左子树上所有节点关键字值均不大于根结点的关键字值;
2.
若右子树非空,则右子树上所有节点关键字值均不小于根结点的关键字值;
3.
左、右子树本身也是一棵二叉排序树。
现在给你
N
个关键字值各不相同的节点,要求你按顺序插入一个初始为空的二叉树中,每
次插入成功后,求相应的父节点的关键字值,如果没有父节点,则输出
-1
。
输入:
输入包含多组测试数据,每组测试数据两行。
第一行,一个数字
N
(
N<=100
),表示待插入的节点数。
第二行,
N
个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过
10
的
8
次方。
输出:
输出共
N
行,每次插入节点后,该节点对应的父节点的关键字值。
样例输入:
5
2 5 1 3 4
样例输出:
-1
2
2
5
3
1、思路:主要是建立二叉排序树,注意父节点的输出。
2、源代码
#include <iostream>
using namespace std;
// 二叉树节点定义
struct BSTreeNode {
int data;
BSTreeNode *lchild;
BSTreeNode *rchild;
BSTreeNode(int x) {
this->data = x;
this->lchild = NULL;
this->rchild = NULL;
}
} ;
/** \brief 建立排序二叉树
* 递归建树,不必等树建好后再输出每个节点的父节点,
* 插入时用一个变量记录父节点的值,建树的同时输出父节点的值
* \param
* \param
* \return
*
*/
BSTreeNode* Insert(BSTreeNode *T,int x,int father) {
if(T == NULL) {
T = new BSTreeNode(x);
cout << father << endl;
} else if(x < T->data) { // 插入左子树
T->lchild = Insert(T->lchild, x, T->data);
} else { // 插入右子树
T->rchild = Insert(T->rchild, x, T->data);
}
return T;
}
int main()
{
int n;
while(cin >> n) {
BSTreeNode* root = NULL;
for(int i = 0 ; i < n ; i++) {
int x;
cin >> x;
root = Insert(root,x,-1);
}
}
return 0;
}
Problem B.
二进制数
题目描述
大家都知道,数据在计算机中存储是以二进制的形式存储的。
有一天,小明学了
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
1、思路:
(1)本质是将十进制转换为二进制,将n不断对2取模和对2整除运算,得到各个数位的值;
(2)注意数位顺序,求到的是从b1到bn,输出需要从bn到b1,即逆序输出。
2、源代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--) {
unsigned int n;
cin >> n;
vector<int> v;
while(n != 0) {
v.push_back(n%2);
n /= 2;
}
for(int i = v.size() - 1 ; i >= 0 ; --i) { // 逆序输出
cout << v[i];
}
cout << endl;
}
return 0;
}
Problem C.
矩阵幂
矩阵幂_牛客题霸_牛客网 (nowcoder.com) 之前做过,但是很磕巴…
题目描述:
给定一个
n*n
的矩阵,求该矩阵的
k
次幂,即
P^K
。
输入:
输入包含多组测试数据。
数据的第一行为一个整数(
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
后面有时间再看看吧,有点难了还是orz。