题目描述
一个XX产品行销总公司,只有一个boss,其有若干一级分销,一级分销又有若干二级分销,每个分销只有唯一的上级分销。
规定,每个月,下级分销需要将自己的总收入(自己的+下级上交的)每满100元上交15元给自己的上级。
现给出一组分销的关系,和每个分销的收入,请找出boss并计算出这个boss的收入。
比如:
- 收入100元,上交15元;
- 收入199元(99元不够100),上交15元;
- 收入200元,上交30元。
输入:
分销关系和收入:[[分销id 上级分销id 收入], [分销id 上级分销id 收入], [分销id 上级分销id 收入]]
- 分销ID范围: 0..65535
- 收入范围:0..65535,单位元
提示: 输入的数据只存在1个boss,不存在环路
输出:
[boss的ID, 总收入]
输入描述
第一行输入关系的总数量 N
第二行开始,输入关系信息,格式:
分销ID 上级分销ID 收入
比如:
5
1 0 100
2 0 199
3 0 200
4 0 200
5 0 200
输出:
0 120
比如:
3
0 1 185
2 0 199
3 1 200
输出:
1 60
方法一(自己的解):
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
int main()
{
int m;
cin >> m;
unordered_map<int, int> mup; //存储up的所有下级个数
unordered_map<int, int> mdown; //存储id的上级up,上级只有一个,下级有多个
unordered_map<int, long long> mval; //存储id自己赚的钱
unordered_set<int> st; //存储所有下级id
while (m--)
{
int id, up , val;
cin >> id >> up >> val;
mup[id]=up; //记录上级up
mdown[up]++; //记录每个点的下级数
mval[id] += val; //记录收入
st.insert(id); //存储下级id
}
queue<int> q;
for (int x : st)
{
if (mdown[x]== 0) // 将没有下级(入度为 0) 的点入队
{
q.push(x);
}
}
bool flag = false;
while (q.size())
{
int id = q.front();
q.pop();
int up = mup[id];
if(mdown[up]>0)
mval[up] += mval[id] / 100 * 15; // 计算收入
mdown[up]--; // 入度-1
// 最后剩下的点一定是 boss
if(mup[up] == 0 && q.size() == 0)
{
cout << up << " " << mval[up] << endl;
}
else if (mdown[up] == 0) // 否则将入度为 0 的点入队
q.push(up);
}
return 0;
}
方法二(ai):
#include <iostream>
#include <vector>
#include <queue>
#include <set>
using namespace std;
const int MAX = 65536;
int main() {
int N;
cin >> N;
vector<int> children(MAX,0); // 每个分销商的子分销商数量
vector<long long> income(MAX); // 每个分销商的总收入
vector<int> parent[MAX]; // 每个分销商的上级分销ID,邻接矩阵构成图,是二维数组
set<int> ids; //用于记录所有节点ID
// 输入分销关系和收入
for (int i = 0; i < N; ++i) {
int id, up_id, inc;
cin >> id >> up_id >> inc;
ids.insert(id);
ids.insert(up_id);
income[id] = inc; // 设置初始收入
parent[id].push_back(up_id); // 设置上级分销ID
children[up_id]++;
}
queue<int> q;
for (int i: ids) {
if (children[i] == 0) {
q.push(i);
}
}
//使用队列进行广度优先搜索,从最后节点开始逐层向上
while (q.size()) {
int n = q.front();
q.pop();
for(int id : parent[n]) {
income[id] += (income[n] / 100) * 15;
children[id]--;
// 如果上级分销商的子分销商数量减为0,则将其加入队列
if (children[id]==0) {
q.push(id);
}
}
if(q.size()==0){
// 找出boss并输出其ID和总收入
cout << n << " " << income[n] << endl;
}
}
return 0;
}

8574

被折叠的 条评论
为什么被折叠?



