【POJ】Genealogical tree 深度优先搜索dfs+哈希表;Yogurt factory 贪心

POJ记录-20221221

目录

Genealogical tree

Yogurt factory 


Genealogical tree

问题描述:

总时间限制: 1000ms内存限制: 65536kB

描述

火星人的血缘关系体系已经够混乱的了。实际上,火星人在他们想要的时候和他们想要的地方发芽。他们聚集在不同的群体中,因此火星人可以有一个父母,也可以有十个父母。没有人会对一百个孩子感到惊讶。火星人已经习惯了这一点,他们的生活方式在他们看来是自然的。
在行星理事会中,混乱的家谱系统导致了一些尴尬。在那里遇到了最有价值的火星人,因此,为了在所有讨论中冒犯任何人,首先用于让老火星人发言,而不是年轻的火星人,而不是最年轻的无子女评估员。然而,维持这个秩序真的不是一件小事。火星人并不总是认识他所有的父母(关于他的祖父母也没有什么可说的!但是,如果由于错误而首先说一个孙子,并且只比他年轻的曾祖父说话,这是一个真正的丑闻。
你的任务是编写一项纲领,该方案将一劳永逸地确定一项秩序,保证安理会每个成员都比他的每个后代更早发言。

输入

标准输入的第一行仅包含一个数字 N,1 <= N <= 100 — 火星行星理事会的一些成员。根据数百年的传统,理事会的成员用从1到N的自然数进行枚举。此外,正好有 N 行,而且,第 I 行包含第 I 个成员的子项列表。子项列表是一系列子项的序列号,按空格分隔的任意顺序排列。子项列表可能为空。列表(即使为空)以 0 结尾。

输出

标准输出应在其唯一行中包含一系列扬声器的数字,用空格分隔。如果多个序列满足问题的条件,则要向标准输出中的任何一个写入。至少有一个这样的序列始终存在。

#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<stack>
#include<unordered_set>
using namespace std;

unordered_set<int> children;//已经检查过的、后代的集合
stack<int> stk;             //输出的队列

bool children_ordered(vector<vector<int>>& genetree,int i) {
	for (auto mem : genetree[i]) {
		if (children.find(mem) == children.end()) {
			return false;
		}
	}
	return true;
}

void dfs(vector<vector<int>>& genetree, vector<bool>&vis,int ance) {
	//如果这个节点的孩子集合为空,说明是最小的成员,入孩子集合+入栈
	vis[ance] = true;
	if (genetree[ance].empty()) {
		children.insert(ance);
		stk.push(ance);
		return;
	}
	else {
		//检查每个孩子有没有加入孩子集合
		for (auto mem : genetree[ance]) {
			//如果有孩子没有加入孩子集合,说明比自己年轻的还没加入栈
			if (children.find(mem) == children.end()) {
				dfs(genetree,vis,mem);
			}
		}
		//没有上面的情况,说明所有孩子都入栈了,说明自己是当前最小的成员,入孩子集合+入栈
		children.insert(ance);
		stk.push(ance);
	}
}

int main() {
	//任务:先输出年老的,后输出后代
	//输入
	int n;
	cin >> n;
	vector<vector<int>> genetree(n+1);
	genetree[0].push_back(0);

	for (int i = 1; i < n+1; ++i) {
		int mem;
		while (cin >> mem) {
			if (mem == 0) break;
			genetree[i].push_back(mem);
		}
	}
	//检查家谱树,从1号成员开始dfs
	vector<bool> vis(n+1, false);
	for (int i = 1; i < n+1; ++i) {
		if(!vis[i])		dfs(genetree, vis, i);
	}
	//输出
	while(!stk.empty()){
		cout << stk.top() << ' ';
		stk.pop();
	}
}

Yogurt factory 

描述

奶牛们买下了一家酸奶工厂,生产举世闻名的Yucky酸奶。在接下来的N(1 <= N <= 10,000)周内,牛奶和劳动力的价格将每周波动,因此公司将花费C_i(1 <= C_i <= 5,000)美分在第一周生产一单位酸奶。Yucky的工厂设计精良,每周可以生产任意数量的酸奶。

Yucky Yogurt拥有一个仓库,可以以每周每单位酸奶S(1 <= S <= 100)美分的恒定费用存储未使用的酸奶。幸运的是,酸奶不会变质。Yucky Yogurt的仓库很大,所以它可以容纳任意许多单位的酸奶。

Yucky 希望找到一种方法,每周向其客户交付 Y_i (0 <= Y_i <= 10,000) 单位的酸奶(Y_i是第 i 周的交付数量)。帮助 Yucky 在整个 N 周期间最大限度地降低成本。第一周生产的酸奶,以及任何已经储存的酸奶,都可以用来满足Yucky当周的需求。

输入

* 第 1 行:两个空格分隔的整数 N 和 S.

* 第 2..N+1 行:第 i+1 行包含两个空格分隔的整数:C_i 和 Y_i。

输出

* 第 1 行:第 1 行包含一个整数:满足酸奶时间表的最低总成本。请注意,对于 32 位整数来说,总数可能太大。

样例输入

4 5
88 200
89 400
97 300
91 500

样例输出

126900
#include <iostream>
#include<vector>
using namespace std;

long long totoalcost(vector<vector<int>>&cost,int n,int s) {
	long long res = 0;
	int precost = 5005;
	for (int i = 1; i < n+1; ++i) {
		int curcost = min(cost[i][0], precost + s);
		precost = curcost;
		res += curcost*cost[i][1];
	}
	return res;
}

int main()
{
	int n, s;
	cin >> n >> s; //n weeks, s:money to store
	vector<vector<int>> cost(n+1, vector<int>(2));
	for (int i = 1; i < n+1; ++i) {
		cin >> cost[i][0] >> cost[i][1];   //cost[i][0]:ith week produce cost; cost[i][1] amount to give
	}
	cout<<totoalcost(cost,n, s);
}

猜你喜欢

转载自blog.csdn.net/icecreamTong/article/details/128400287
今日推荐