PTAサプライチェーンの最低価格(25分)

無限の光を放つのは人間の心であり、無限の闇を生み出すのも人間の心であり、光と闇が絡み合って戦うこの世界は、懐かしくて無力な世界です。

サプライチェーンとは、小売業者(小売業者)、流通業者、およびサプライヤ(サプライヤ)のネットワークであり、サプライヤから顧客への製品の移動に関わるすべての人です。

1つのルートサプライヤーから始めて、チェーン上の全員が価格Pで自分のサプライヤーから製品を購入し、Pよりもr%高い価格でそれらを販売または配布します。顧客に直面するのは小売業者のみです。サプライチェーンの各メンバーには、ルートサプライヤーを除くサプライヤーが1つだけあり、サプライサイクルがないことが前提です。

サプライチェーンを考えると、顧客が一部の小売業者に期待できる最低価格を伝える必要があります。

入力仕様:

各入力ファイルには1つのテストケースが含まれています。いずれの場合も、最初の行には3つの正の数が含まれています:N(≤105)、サプライチェーンのメンバーの総数(したがって、それらのIDは0からN-1まで番号が付けられ、ルートサプライヤーの番号が付けられます) IDは0); P、ルートサプライヤーから提供された価格。そして、r、各ディストリビューターまたは小売業者のための価格増分のパーセント。次にN行が続き、それぞれが次の形式で販売業者または小売業者を説明します。

K i ID [1] ID [2] ... ID [K i]

ここで、i行目のK iは、サプライヤーiから製品を受け取るディストリビューターまたは小売業者の総数であり、その後にこれらのディストリビューターまたは小売業者のIDが続きます。K jが0であることは、j番目のメンバーが小売業者であることを意味します。行内のすべての数値はスペースで区切られています。

出力仕様:

各テストケースについて、一部の小売業者から予想できる最低価格、正確には小数点第4位まで、および最低価格で販売する小売業者の数を1行で印刷します。2つの数値の間にはスペースが1つ必要です。すべての価格が10 10を超えないことが保証されています。

入力例:

10 1.80 1.00
3 2 3 5
1 9
1 4
1 7
0
2 6 1
1 8
0
0
0

出力例:

1.8362 2
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include<climits>//INT_MAX

//#include<bits/stdc++.h>
#define PP pair<ll,int>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
#define PI 3.1415926
typedef long long ll;
using namespace std;
int const mod=1e9+7;
const int maxn=1e5+10;
vector<int>a[maxn];
int n;
double P,r;
int mih=maxn,jg;
void dfs(int v,int h)
{
    if(a[v].size()==0)
    {
        if(h<mih)
            mih=h,jg=1;
        else if(h==mih)
                jg++;
    }
    for(int i=0;i<a[v].size();i++)
    {
        int u=a[v][i];
        dfs(u,h+1);
    }
}
int main()
{
    scanf("%d%lf%lf",&n,&P,&r);
    r/=100;
    for(int i=0;i<n;i++)
    {
        int k,x;
        scanf("%d",&k);
        while(k--)
        {
            scanf("%d",&x);
            a[i].push_back(x);
        }
    }
    dfs(0,1);
    printf("%.4f %d",P*pow(1+r,mih-1),jg);
    return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_44170305/article/details/108445973