第二天PAT-A1090 Highest Price in Supply Chain第三组测试样例解释

A1090

Description:

在将产品从供应商流通至消费者的过程中包含零售商、经销商和供应商三个角色。

从一个根供应商起,每人将价格定位进价的(100+r)%,只有零售商会面对消费者。保证供应链上的每个校色只有一个供应商(除了根供应商)。

给一个供应链,求所有零售商中最高的销售额。

同系列题目:

  • A1079 Total Sales of Supply Chain
  • A1106 Lowest Price in Supply Chain

Input:

  • 每组测试包含一个样例
  • 第一行:供应链上的所有角色数N <= 1e5,根供应商提供的价格P,价格增长比r
  • 接下来一行包括N个数字,数字Si代表第i名角色的供应商下标
  • 根供应商的下标被定义为-1
9 1.80 1.00
1 5 4 4 -1 4 5 3 6

Output:

  • 每个测试样例输出一行,打印所有零售商中最高的销售额,保留两位小数,以及与该零售商的有相同价格的零售商总数。保证价格不会超过1e10。
1.85 2

注意:

常见的就不说了,层数计数时,根节点所在层不要忘记计数,修正后第三组才通过。

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1e5+5;

struct node{
    int level;
    vector<int>child;   //孩子节点
}Node[maxn];

double price, r;
int n, root;
int cnt[maxn];
int maxlevel = 0;

void bfs(){
    queue<int>q;
    q.push(root);
    while(!q.empty()){
        for(vector<int>::iterator it = Node[q.front()].child.begin();
            it != Node[q.front()].child.end(); it++){
            Node[*it].level = Node[q.front()].level + 1;
            cnt[Node[*it].level]++;
            if(Node[*it].level > maxlevel)
                maxlevel = Node[*it].level;
            q.push(*it);
        }
        q.pop();
    }
}

int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
    scanf("%d%lf%lf", &n, &price, &r);
    r /= 100;
    int parent;
    for(int i = 0; i < n; i++){
        scanf("%d", &parent);
        if(parent == -1){   //该节点为根节点
            root = i;
            Node[root].level = 0;
            cnt[0] = 1;
        }
        else
            Node[parent].child.push_back(i);
    }
    bfs();
    printf("%.2f %d\n", price*pow(1+r, maxlevel), cnt[maxlevel]);
    return 0;
}

你可能感兴趣的:(PAT)