蓝桥练习题题解——作物杂交——Java
作物雜交(難度較高,不應該給大專的出啊)
時間限制:1.0s ? 內存限制:256.0MB
問題描述
作物雜交是作物栽培中重要的一步。已知有?N?種作物(編號?1?至?N?),第?i?種作物從播種到成熟的時間為?Ti。
作物之間兩兩可以進行雜交,雜交時間取兩種中時間較長的一方。如作物?A?種植時間為?5?天,作物?B?種植時間為?7?天,則?AB?雜交花費的時間為?7?天。
作物雜交會產生固定的作物,新產生的作物仍然屬于?N?種作物中的一種。
初始時,擁有其中?M?種作物的種子(數量無限,可以支持多次雜交)。同時可以進行多個雜交過程。
求問對于給定的目標種子,最少需要多少天能夠得到。
如存在?4?種作物?ABCD,各自的成熟時間為?5?天、7?天、3?天、8?天。初始擁有?AB?兩種作物的種子,目標種子為?D,已知雜交情況為?A×B→C,A×C→D。
則最短的雜交過程為:
第?1?天到第?7?天(作物?B?的時間),A×B→C。
第?8?天到第?12?天(作物?A?的時間),A×C→D。
花費?12?天得到作物?D?的種子。
輸入格式
輸入的第?1?行包含?4?個整數?N,M,K,T,N?表示作物種類總數(編號?1?至?N),M?表示初始擁有的作物種子類型數量,K?表示可以雜交的方案數,T?表示目標種子的編號。
第?2?行包含?N?個整數,其中第?i?個整數表示第?i?種作物的種植時間?Ti(1≤Ti≤100)。
第?3?行包含?M?個整數,分別表示已擁有的種子類型?Kj(1≤Kj≤M),Kj?兩兩不同。
第?4?至?K+3?行,每行包含?3?個整數?A,B,C,表示第?A?類作物和第?B?類作物雜交可以獲得第?C?類作物的種子。
輸出格式
輸出一個整數,表示得到目標種子的最短雜交時間。
樣例輸入
6 2 4 6 5 3 4 6 4 9 1 2 1 2 3 1 3 4 2 3 5 4 5 6樣例輸出
16樣例說明
第?1?天至第?5?天,將編號?1?與編號?2?的作物雜交,得到編號?3?的作物種子。
第?6?天至第?10?天,將編號?1?與編號?3?的作物雜交,得到編號?4?的作物種子。
第?6?天至第?9?天,將編號?2?與編號?3?的作物雜交,得到編號?5?的作物種子。
第?11?天至第?16?天,將編號?4?與編號?5?的作物雜交,得到編號?6?的作物種子。
總共花費?16?天。
評測用例規模與約定
對于所有評測用例,1≤N≤2000,?2≤M≤N,?1≤K≤100000,?1≤T≤N, 保證目標種子一定可以通過雜交得到。
題解:
package demo;import java.awt.Point; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class demo {static int aa[], dp[];static List<Point> bh[];public static void main(String[] args) throws IOException {StreamTokenizer x = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));x.nextToken();int n = (int) x.nval;x.nextToken();int m = (int) x.nval;x.nextToken();int k = (int) x.nval;x.nextToken();int t = (int) x.nval;aa = new int[n + 1];dp = new int[n + 1];bh = new List[n + 1];Arrays.fill(dp, Integer.MAX_VALUE);int bb[] = new int[m + 1];for (int i = 1; i <= n; i++) {x.nextToken();aa[i] = (int) x.nval;bh[i] = new ArrayList<Point>();}for (int i = 1; i <= m; i++) {x.nextToken();bb[i] = (int) x.nval;dp[bb[i]] = 0;}for (int i = 0; i < k; i++) {x.nextToken();int xx = (int) x.nval;x.nextToken();int yy = (int) x.nval;x.nextToken();int nn = (int) x.nval;bh[nn].add(new Point(xx, yy));}out.println(dfs(t));out.flush();}public static int dfs(int n) {if (dp[n] != Integer.MAX_VALUE)return dp[n];List<Point> p = bh[n];for (int i = 0; i < p.size(); i++) {int x = p.get(i).x, y = p.get(i).y;dp[n] = Math.min(dp[n], Math.max(dfs(x), dfs(y)) + Math.max(aa[x], aa[y]));}return dp[n];} }?
總結
以上是生活随笔為你收集整理的蓝桥练习题题解——作物杂交——Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pmp每日三题(2022年3月14日)
- 下一篇: pmp每日三题(2022年3月15日)