IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 供应链总销售额 Java,c++题解 (求叶子结点权值总和,dfs,bfs,dfs记忆化搜索)【PAT甲级1079】 -> 正文阅读

[数据结构与算法]供应链总销售额 Java,c++题解 (求叶子结点权值总和,dfs,bfs,dfs记忆化搜索)【PAT甲级1079】

输入样例:

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

输出样例:

42.4

解题思路:

求根结点到叶子结点的总权值,用dfs深搜可以递归当前结点的儿子,直到遇到叶子结点时累加权值,但Java的dfs有两个测试点过不去,同样的思路换成c++直接AC;bfs可以在出队时判断是否为叶子结点,并将权值累加;用dfs记忆化搜索当前结点的深度,递归时将搜到的结果都保存下来,最后遍历叶子结点将权值累加。

Java代码:(dfs)

import java.io.*;
import java.util.Arrays;

public class Main {
	static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	public static int ini() throws IOException {
		st.nextToken();
		return (int)st.nval;
	}
	public static double ind() throws IOException {
		st.nextToken();
		return st.nval;
	}
	
	static int n, N = 100005, idx;
	static double p, r, sum, t;
	static int []h = new int[N];
	static int []e = new int[N];
	static int []ne = new int[N];
	static int []w = new int[N];
	
	public static void main(String[] args) throws IOException {
		n = ini(); p = ind(); r = ind();
		Arrays.fill(h, -1);
		for(int i = 0; i < n; i++) {
			int k = ini();
			if(k != 0)
				while(k-- > 0) add(i, ini());
			else w[i] = ini();
		}
		
		dfs(0, 1);
		System.out.printf("%.1f", sum);
	}
	
	public static void dfs(int u, int d) {
		if(h[u] == -1) {
			t = p * Math.pow(1 + 0.01 * r, d - 1);
			sum += t * w[u];
		}
		
		for(int i = h[u]; i != -1; i = ne[i]) {
			int j = e[i];
			dfs(j, d + 1);
		}
	}
	
	public static void add(int a, int b) {
		e[idx] = b;
		ne[idx] = h[a];
		h[a] = idx++;
	}
}

?

?

c++代码:(dfs)

#include <bits/stdc++.h>

const int N = 100005;
int  n, idx;
int h[N], e[N], ne[N], w[N];
double p, r, sum, t;

void dfs(int u, int d){
	if(h[u] == -1){
		t = p * pow(1 + 0.01 * r, d - 1);
		sum += t * w[u];
	}
	
	for(int i = h[u]; i != -1; i = ne[i]){
		int j = e[i];
		dfs(j, d + 1);
	}
}

void add(int a, int b){
	e[idx] = b;
	ne[idx] = h[a];
	h[a] = idx++;
}

int main(){
	scanf("%d%lf%lf", &n, &p, &r);
	
	for(int i = 0; i < N; i++) h[i] = -1;
	
	for(int i = 0; i < n; i++){
		int k;
		scanf("%d", &k);
		if(k != 0) 
		    while(k--) {
		    	int x;
		    	scanf("%d", &x);
		    }
		else {
			int x;
			scanf("%d", &w[i]);
		}    
	}
	
	dfs(0, 1);
	printf("%.1lf", sum);
	
	return 0;
} 

?

?

Java代码:(bfs)

import java.io.*;
import java.util.*;

public class Main {
	static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	public static int ini() throws IOException {
		st.nextToken();
		return (int)st.nval;
	}
	public static double ind() throws IOException {
		st.nextToken();
		return st.nval;
	}
	
	static int n, idx;
	static double p, r;
	static int N = 100005;
	static int []e = new int[N];
	static int []ne = new int[N];
	static int []h = new int[N];
	static int []w = new int[N];
	
	public static void main(String[] args) throws IOException {
		n = ini(); p = ind(); r = ind();
		Arrays.fill(h, -1);
		for(int i = 0; i < n; i++) {
			int k = ini();
			if(k != 0) 
				while(k-- > 0) add(i, ini());
			else w[i] = ini();
		}
		if(n == 1) System.out.printf("%.1f", w[0] * p);
		else bfs(0);
	}
	
	public static void bfs(int root) {
		Queue<Integer> qu = new LinkedList<>();
		ArrayList<Integer> list = new ArrayList<>();
		qu.add(root);
		int le = 0;
		double sum = 0;
		while(!qu.isEmpty()) {
			le++;
			if(le > 1) p = (1 + r * 0.01) * p;
			while(!qu.isEmpty()) {
				int t = qu.poll();
				if(t != root && h[t] == -1) sum += w[t] * p;
				for(int i = h[t]; i != -1; i = ne[i]) {
					int j = e[i];
					list.add(j);
				}
			}
			qu.addAll(list);
			list.clear();
		}
		System.out.printf("%.1f", sum);
	}
	
	public static void add(int a, int b) {
		e[idx] = b;
		ne[idx] = h[a];
		h[a] = idx++;
	}
}

?

?

Java代码(dfs记忆化搜索)

import java.io.*;
import java.util.Arrays;

public class Main {
	static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	public static int ini() throws IOException {
		st.nextToken();
		return (int)st.nval;
	}
	public static double ind() throws IOException {
		st.nextToken();
		return st.nval;
	}
	static int N = 100005;
	static int []pa = new int[N];
	static int []cnt = new int[N];
	static int []f = new int[N];
	
	public static void main(String[] args) throws IOException {
		int n = ini();
		double p = ind(), r = ind(), sum = 0;
		Arrays.fill(pa, -1);
		Arrays.fill(f, -1);
		
		for(int i = 0; i < n; i++) {
			int k = ini();
			for(int j = 0; j < k; j++) {
				pa[ini()] = i;
			}
			if(k == 0) cnt[i] = ini();
		}
		
		for(int i = 0; i < n; i++) {
			if(cnt[i] != 0)
				sum += p * Math.pow(1 + r * 0.01, dfs(i)) * cnt[i];
		}
		System.out.printf("%.1f", sum);
	}
	
	public static int dfs(int u) {
		if(f[u] != -1) return f[u];
		else if(pa[u] == -1) return f[u] = 0;
		else return f[u] = dfs(pa[u]) + 1;
	}
}

?

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 19:01:27  更:2022-04-22 19:05:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:21:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码