POJ记录-20221221
目录
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);
}