首先说明一下,这个题目其实使用树的层序遍历或者图广度优先遍历是更好的解法。当然DFS加剪枝也是可以的。而下面这个是原始的DFS。它真的会不遗余力地遍历所有的分支。
但是,可能是由于PAT测试点的条件过于宽松,导致这种代码也全通了。
下面上代码(注意DFS过程中不能使用价格来进行判断,因为如果将经手利率设置为0,会导致输出所有的零售商,我第一次测试点4没过就是这么被坑了。)
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <vector>
#include <map>
using namespace std;
const int M = 100005;
double initPrice, increment;
int n, minCnt = INT32_MAX,cnt;
vector<int> s[M];
map<int, int> cntMap;
void dfs(int start) {
if (s[start].size() == 0) {
//结算
cntMap[cnt]++;
if (cnt < minCnt)
minCnt = cnt;
} else {
cnt++;
for (int i = 0; i < s[start].size(); i++)
dfs(s[start][i]);
cnt--;
}
}
int main() {
scanf("%d %lf %lf",&n,&initPrice,&increment);
int k,tmp;
for (int i = 0; i < n; i++) {
scanf("%d",&k);
for (int j = 0; j < k; j++) {
scanf("%d",&tmp);
s[i].push_back(tmp);
}
}
dfs(0);
double price = initPrice;
for (int i = 0; i < minCnt; i++)
price += (price*increment / 100);
printf("%.4lf %d", price,cntMap[minCnt]);
return 0;
}