POJ 刷题系列:1860. Currency Exchange
来源:互联网 发布:原油api数据公布网站 编辑:程序博客网 时间:2024/06/05 13:30
POJ 刷题系列:1860. Currency Exchange
传送门:1860. Currency Exchange
题意:
N种货币,任意货币之间可以相互转换,转换需要手续费commission,假设货币A当前金额为money,转换公式如下:(money - commission) * rate,现给出任意货币之间的转换手续和转换率,问从S点出发,是否存在一条路径使得回到S时,能够增值。
思路:
实际上,该问题和判断负环类似,只要在S的路径上存在一条环,使得经过该环上的结点出现增值,那么就能产生无限的现金。自然地,定义dp[i]:表示从源点S出发到结点i的现金流。如果不存在这样的环,必然最多经过N-1次就停止更新,否则就会无限更新下去。
代码如下:
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Map;import java.util.StringTokenizer;public class Main{ String INPUT = "./data/judge/201712/P1860.txt"; public static void main(String[] args) throws IOException { new Main().run(); } class Edge{ int from; int to; double rate; double commission; Edge(int from, int to, double rate, double commission){ this.from = from; this.to = to; this.rate = rate; this.commission = commission; } @Override public String toString() { return from + " " + to; } } void read() { int N = ni(); int M = ni(); int S = ni(); double money = nd(); List<Edge> edges = new ArrayList<Edge>(); for (int i = 0; i < M; ++i) { int from = ni(); int to = ni(); from --; to --; double rate = nd(); double commission = nd(); edges.add(new Edge(from, to, rate, commission)); rate = nd(); commission = nd(); edges.add(new Edge(to, from, rate, commission)); } double[] dp = new double[N]; dp[S - 1] = money; boolean valid = false; for (int i = 0; i < N; ++i) { for (Edge e : edges) { double preMoney = dp[e.from]; if (preMoney - e.commission >= 0) { double nxtMoney = (preMoney - e.commission) * e.rate; if (nxtMoney > dp[e.to]) { dp[e.to] = nxtMoney; if (i == N - 1) { valid = true; } } } } } out.println(valid ? "YES" : "NO"); } FastScanner in; PrintWriter out; void run() throws IOException { boolean oj; try { oj = ! System.getProperty("user.dir").equals("F:\\oxygen_workspace\\Algorithm"); } catch (Exception e) { oj = System.getProperty("ONLINE_JUDGE") != null; } InputStream is = oj ? System.in : new FileInputStream(new File(INPUT)); in = new FastScanner(is); out = new PrintWriter(System.out); long s = System.currentTimeMillis(); read(); out.flush(); if (!oj){ System.out.println("[" + (System.currentTimeMillis() - s) + "ms]"); } } public boolean more(){ return in.hasNext(); } public int ni(){ return in.nextInt(); } public long nl(){ return in.nextLong(); } public double nd(){ return in.nextDouble(); } public String ns(){ return in.nextString(); } public char nc(){ return in.nextChar(); } class FastScanner { BufferedReader br; StringTokenizer st; boolean hasNext; public FastScanner(InputStream is) throws IOException { br = new BufferedReader(new InputStreamReader(is)); hasNext = true; } public String nextToken() { while (st == null || !st.hasMoreTokens()) { try { st = new StringTokenizer(br.readLine()); } catch (Exception e) { hasNext = false; return "##"; } } return st.nextToken(); } String next = null; public boolean hasNext(){ next = nextToken(); return hasNext; } public int nextInt() { if (next == null){ hasNext(); } String more = next; next = null; return Integer.parseInt(more); } public long nextLong() { if (next == null){ hasNext(); } String more = next; next = null; return Long.parseLong(more); } public double nextDouble() { if (next == null){ hasNext(); } String more = next; next = null; return Double.parseDouble(more); } public String nextString(){ if (next == null){ hasNext(); } String more = next; next = null; return more; } public char nextChar(){ if (next == null){ hasNext(); } String more = next; next = null; return more.charAt(0); } } static class D{ public static void pp(int[][] board, int row, int col) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { sb.append(board[i][j] + (j + 1 == col ? "\n" : " ")); } } System.out.println(sb.toString()); } public static void pp(char[][] board, int row, int col) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { sb.append(board[i][j] + (j + 1 == col ? "\n" : " ")); } } System.out.println(sb.toString()); } } static class ArrayUtils { public static void fill(int[][] f, int value) { for (int i = 0; i < f.length; ++i) { Arrays.fill(f[i], value); } } public static void fill(int[][][] f, int value) { for (int i = 0; i < f.length; ++i) { fill(f[i], value); } } public static void fill(int[][][][] f, int value) { for (int i = 0; i < f.length; ++i) { fill(f[i], value); } } } static class Num{ public static <K> void inc(Map<K, Integer> mem, K k) { if (!mem.containsKey(k)) mem.put(k, 0); mem.put(k, mem.get(k) + 1); } }}
阅读全文
0 0
- POJ 刷题系列:1860. Currency Exchange
- POJ 1860 Currency Exchange
- poj 1860 Currency Exchange
- POJ 1860 Currency Exchange
- Poj 1860 Currency Exchange
- POJ 1860 Currency Exchange
- poj 1860 Currency Exchange
- POJ 1860 Currency Exchange
- poj 1860 Currency Exchange
- POJ 1860 Currency Exchange
- POJ 1860 Currency Exchange
- POJ 1860 Currency Exchange
- poj 1860 Currency Exchange
- POJ 1860 Currency Exchange
- poj 1860 Currency Exchange
- POJ-1860-Currency Exchange
- POJ 1860 Currency Exchange
- poj Currency Exchange
- latex算法书写
- p2p项目总结
- mysql日期时间操作函数详解
- 【SpringMVC】文件上传Expected MultipartHttpServletRequest: is a MultipartResolver错误解决
- Testing Round #14 (Unrated) A
- POJ 刷题系列:1860. Currency Exchange
- 【Java学习笔记】内部类
- 牛客网 Wannafly挑战赛6 逆序对(思路)
- 在IAR中的workspace增加下载代码选项
- Service Mesh 现在如此火热,你了解多少?
- TensorFlow RNN 文本情感分析
- Presto-[12]-Syntax-EXPLAIN
- label和span标签设置宽度width无效问题的解决方式
- Testing Round #14 (Unrated) B