广联达笔试题

第一题

题目描述:
在课堂上,老师与同学们玩了这样一个游戏: 老师先在黑板上写下了一个数x,之后让n-1个同学依次选择如下两种操作之一进行操作:
1.在黑板上写下5x,即写下x的五倍这个数:
2.当且仅当x是偶数时可以在黑板上写下x/2这个数字。

每个同学操作之后,黑板上新写下的数变成下一个同学的数X。
不过同学们写数字时都是比较乱的。下课之后,你从隔壁班走过来看见黑板上一共有n个数字不知道它们被写下来的顺序,只知道老师写的数字是x。你的任务是找到一个合法的被写下的数字顺序。如果有多个答案符合要求,请输出字典序最小的那个序列,

两个序列[a1,a2…an] [b1,b2…bn]的字典序定义为:从左到右找到第一个位置,满足ai≠bi;,若ai

输入描述
第一行两个正整数n,x,表示黑板上的数字个数和老师写的数字
第二行n个正整数a1,a2…an,表示黑板上这n个数。老师写的数字也在这里面
1

输出描述
输出一行n个数,表示字典序最小的合法的序列。

样例输人

5 16
8 20 16 10 4

样例输出

16 8 4 20 10
#include
#include
#include
using namespace std;
#define LL long long

int main() {
	LL n, start;
	cin >> n >> start;
	unordered_multiset<LL>NumsSet;
	int temp = 0;

	for (int i = 0; i < n; i++) {
		cin >> temp;
		NumsSet.insert(temp);
	}
	NumsSet.erase(start);
	cout << start << " ";
	int next = 0;
	while (!NumsSet.empty()) {
		if ((start % 2 == 0) && NumsSet.count(start / 2)) {			//偶数
			start = start / 2;
			NumsSet.erase(start);
			cout << start << " ";
		}
		else {
			start = 5 * start;
			NumsSet.erase(start);
			cout << start << " ";
		}
	}
	//cout << "hello world" << endl;
	//system("pause");
	return 0;
}

小明在梦中困在一个迷宫里了。迷宫太难了,小明发动特殊能力让迷宫变得简单起来。迷官变成了一张个节点的有根树(根为1号节点)的结构,只能在一个节点往其儿子节点走,而当没有导向其他节点的路径存在时,即该节点没有儿子节点时,便走出了迷宫。这样一来,小明只要沿着任意可以走的路径行进就肯定可以到达出口了! 出发前为了做好周密准备,小明想知道处于这个迷宫的各个位置能走到哪些出口

输入描述
第一行3个整数分别为n,m和q,表示迷宫节点数量迷宫路径数量询问数量
第二行m个整数u1 u2…um
第三行m个整数V1 V2…Nme
其中ui vi代表第i条有向路径从节点ui通往节点Vi,即节点ui有一个儿子节点vi。保证形成一棵以1号节点为根的有根树。
第四行9个整数a1 a2 …an。表示第i次询问为: 若处于ai节点,可能到达多少个不同的出口?
注意,若一个节点没有导向其他节点的路径存在时,即没有儿子节点时,这个节点则为一个出口
i

输出描述
输出一行g个整数,分别表示每次询问的答案

样例输入

3 2 3
1 1
2 3
1 2 3

样例输出

2 1 1

提示
节点1可以走向节点2和节点3,并不是出口
节点2和节点3都没有导向其他节点的路径了,均为出口。
若处于节点1,可以走向节点2或节点3,有2种可能的出口。
若处于节点2,只有节点2本身一个出口;节点3同理。

#include 
#include 
using namespace std;
#define LL long long

int dfsWaysCount(vector<vector<int> >& Nodes, int a) {
	//int res = 1;
	if (Nodes[a].empty()) return 1;
	int res = 0;
	for (int i = 0; i < Nodes[a].size(); ++i) {
		res += dfsWaysCount(Nodes, Nodes[a][i]);
	}
	return res;
}

int main()
{
	int n, m, q;
	cin >> n >> m >> q;
	vector<vector<int> > Nodes(n + 1, vector<int>());
	vector<int> father;
	vector<int> son;
	for (int i = 0; i < m; ++i) {
		int u;
		cin >> u;
		father.push_back(u);
	}
	for (int i = 0; i < m; ++i) {
		int v;
		cin >> v;
		Nodes[father[i]].push_back(v);
	}
	
	for (int i = 0; i < q; ++i) {
		int a;
		cin >> a;
		cout << dfsWaysCount(Nodes, a);
	}

	return 0;
}

你可能感兴趣的:(算法)