Boss的收入-E卷

题目描述

一个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;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值