Problem.A 反转单词
思路
经典的考察对于输入输出流的理解的题,可作为模板记住,用字符串型的栈存储输入的单词,因为题中说明了没有连续空格也没有标点符号,所以可以放心使用cin,跳过空格但不跳过回车,回车需要特殊处理。个人认为也可用getline(cin,str," ")作为循环条件(如果包含空格或者是标点就要这么做),第三个参数设置为空格来表示一次输入的结束。
#include <iostream>
#include <string>
#include <stack>
#include <cstdio>
using namespace std;
int main()
{
stack<string> s;
string str;
while (cin >> str) { //使用cin<<str作为循环条件,自动在EOF的时候退出,并且会跳过空格,即缓冲区中不包含空格
while (!s.empty())
s.pop(); //栈初始化
while (1) {
s.push(str);
if (getchar() == '\n')
break;//cin会在输入缓冲中保留回车,所以遇到回车就代表一行输入结束
cin >> str;
}//一组数据输入完毕
while (!s.empty()) {
str=s.top();
s.pop();
cout << str;//放入输出缓冲中
if(!s.empty())
cout << " ";
}
cout << endl;//将输出缓冲区的内容输出,endl自动输出回车
}
return 0;
}
链接:北邮OJ_反转单词
Problem.B 912星球的研究生
思路
建立一个结构体储存一个学生的id和score,输入对应数据,值得注意的是这里的cin>>int型数据是会自动转化为int型的(我做的时候以为只能输入到字符串型变量中,手动化为int型,又麻烦又容易错)
这道题读题也挺重要的,这里的n是命令行的行数,也是最大的研究生数量,而不是实际的研究生数量,这导致我找了将近两个小时的bug,非常不爽。
#include<iostream>
#include<string>
using namespace std;
struct node {
int id;
int score_number;
};
node stu[100];
int main() {
int T, n;
int size;
int found;
string str;
int id_num, score_num;
cin >> T;;
int i, j;
while (T--) {
cin>>n;
size = 0;
j = 0;
while (j++<n) {
cin >> str;
if (str == "Insert") {
cin >> id_num >> score_num;
size++;
stu[size - 1].id = id_num;
stu[size - 1].score_number = score_num;
}
else if (str == "Find") {
cin >> id_num;
found = 0;
for (i = 0; i < size; i++)
if (stu[i].id == id_num) {
cout << "name:" << stu[i].id << " score:" << stu[i].score_number << endl;
found = 1;
break;
}
if (found == 0)
cout << "No result!" << endl;
}
}
}
system("pause");
return 0;
}
Problem.C 寻找宝藏
思路
重点是树的顺序表示法,在c++中因为一个孩子有且仅有一个父亲节点,所以表示所有的父亲节点可以简单地用数组表示,下标表示孩子结点标号;因为一个父亲节点可以有多个孩子,所以表示所有的孩子节点必须用vector容器,下标表示父结点标号。
每个叶节点到根节点有且仅有一条路径,用1连续除以把这个路径上每个分支节点的孩子个数就可以得到所求概率。
#include<iostream>
#include<vector>
using namespace std;
//因为一个孩子有且仅有一个父亲节点,所以表示所有的父亲节点可以简单地用数组表示,下标表示孩子结点标号
int parent[1010];
//因为一个父亲节点可以有多个孩子,所以表示所有的孩子节点必须用vector容器,下标表示父结点标号
vector<int> child[1010];
int main() {
int N, M, L;
int i;
int from, to;
int tmp;
cin >> N >> M >> L;
for (i = 0; i < M; i++) {
cin >> from >> to;
parent[to] = from;
child[from].push_back(to);
}
float p = 1.0, child_num;
tmp = L;
while (tmp != 0) {
tmp = parent[tmp];
child_num = child[tmp].size(); //vector中每个元素的邻接节点个数可以由size函数算出
p /= child_num;
}
printf("%0.6f", p);
return 0;
}
思路还是借鉴别人的,代码同样是自己敲的,自己对于c++的基础太薄弱且不熟练,不过相信量变总能产生质变!
链接:北邮OJ_寻找宝藏
Problem.D 哈夫曼树(求WPL)
思路
这道题把我看晕了,网上一些过来人也都是放弃,考虑到自己很有可能也不会做,加上真做出来也没有参考的别的代码,我也暂且放弃,留给大佬们做吧。
链接:北邮OJ_公式推导