Codeforces Round #327 (Div. 1) D. Top Secret Task(DP)
来源:互联网 发布:foxmail邮箱服务器端口 编辑:程序博客网 时间:2024/05/17 00:40
大致题意:
题意很简单,就是n个数,求最多两两交换S次,使前K个数的和最小
n <= 150, s = 1e9
思路:
显然s >= n * n / 2 时总能把前K小的数交换到前K个位置
而且交换不交叉时是最优的,比如Ak 与 A(k+x)交换, 接下来Ak-1只能A(k+y)(y > x) 交换,总是最优的
这样每次交换的代价是j - i,再增加一维可行位置保证不交叉,这样就是S容量的背包问题
//package ok;import java.math.*;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigInteger; import java.util.StringTokenizer; import java.io.PrintWriter;import java.util.Arrays;public class a { public static void main(String args[]) { Scanner in = new Scanner(System.in); PrintWriter out = new PrintWriter(System.out); int n = in.nextInt(); int k = in.nextInt(); int s = in.nextInt(); int[] a = new int[n + 100]; for (int i = 1; i <= n ; i++) a[i] = in.nextInt(); if(s >= n * (n - 1) / 2) { Arrays.sort(a, 1, n + 1); int ans = 0; for(int i = 1; i <= k; i ++) ans += a[i]; out.println(ans); out.flush(); return ; } int [][][]dp = new int[n + 10][s + 10][2]; int ans = 0; for(int i = 1; i <= k; i ++) ans += a[i]; for(int i = 1; i <= k; i ++) { int cur = i & 1; for(int j = n; j >= k + 1; j --) for(int c = 0; c <= s; c ++) { dp[j][c][cur] = Math.max(dp[j+1][c][cur], dp[j][c][cur ^ 1]); if( c >= j - i && a[j] < a[i] ) dp[j][c][cur] = Math.max(dp[j][c][cur], dp[j + 1][c - (j - i)][cur ^ 1] + a[i] - a[j]); } } out.println(ans - dp[k + 1][s][k & 1]); out.flush(); } static class Scanner { BufferedReader br; StringTokenizer st; public Scanner(InputStream in) { br = new BufferedReader(new InputStreamReader(in)); eat(""); } private void eat(String s) { st = new StringTokenizer(s); } public String nextLine() { try { return br.readLine(); } catch (IOException e) { return null; } } public boolean hasNext() { while (!st.hasMoreTokens()) { String s = nextLine(); if (s == null) return false; eat(s); } return true; } public String next() { hasNext(); return st.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } public long nextLong() { return Long.parseLong(next()); } public double nextDouble() { return Double.parseDouble(next()); } public BigInteger nextBigInteger() { return new BigInteger(next()); } public int[] nextIntArray(int n) { int[] is = new int[n]; for (int i = 0; i < n; i++) { is[i] = nextInt(); } return is; } public long[] nextLongArray(int n) { long[] ls = new long[n]; for (int i = 0; i < n; i++) { ls[i] = nextLong(); } return ls; } public double[] nextDoubleArray(int n) { double[] ds = new double[n]; for (int i = 0; i < n; i++) { ds[i] = nextDouble(); } return ds; } public BigInteger[] nextBigIntegerArray(int n) { BigInteger[] bs = new BigInteger[n]; for (int i = 0; i < n; i++) { bs[i] = nextBigInteger(); } return bs; } public int[][] nextIntMatrix(int row, int col) { int[][] mat = new int[row][]; for (int i = 0; i < row; i++) { mat[i] = nextIntArray(col); } return mat; } public long[][] nextLongMatrix(int row, int col) { long[][] mat = new long[row][]; for (int i = 0; i < row; i++) { mat[i] = nextLongArray(col); } return mat; } public double[][] nextDoubleMatrix(int row, int col) { double[][] mat = new double[row][]; for (int i = 0; i < row; i++) { mat[i] = nextDoubleArray(col); } return mat; } public BigInteger[][] nextBigIntegerMatrix(int row, int col) { BigInteger[][] mat = new BigInteger[row][]; for (int i = 0; i < row; i++) { mat[i] = nextBigIntegerArray(col); } return mat; } } }
0 0
- Codeforces Round #327 (Div. 1) D. Top Secret Task(DP)
- codeforces 590D Top Secret Task(dp)
- Codeforces Round #310 (Div. 1) D. Case of a Top Secret 二分 stl应用
- Codeforces 590D Top Secret Task
- Codeforces #590D: Top Secret Task 题解
- 【DP】 cf 590D Top Secret Task
- Codeforces Round #272 (Div. 1)D(字符串DP)
- Codeforces Round #276 (Div. 1)D(贪心+dp)
- Codeforces Round #275 (Div. 1)D(树形DP)
- 【DP】 Codeforces Round #302 (Div. 1) D - Road Improvement
- Codeforces Round #302 (Div. 1)D. Road Improvement 树形dp
- Codeforces Round #276 (Div. 1)D(dp+想法)
- Codeforces Round #202 (Div. 1) D. Turtles dp
- Codeforces Round #276 (Div. 1) D. Kindergarten dp
- Codeforces Round #228 Div.1 D 数位dp+数学
- Codeforces Round #263 (Div. 2)D(树形DP)
- Codeforces Round #264 (Div. 2)D(图论+dp)
- Codeforces Round #266 (Div. 2)D(DP)
- PHP array_slice
- gen already exists but is not a source folder. Convert to a source folder or rename it.
- Golang的select/非缓冲的Channel实例详解
- 【智能路由器】开篇
- Android6.0 新特性详解
- Codeforces Round #327 (Div. 1) D. Top Secret Task(DP)
- 顺序栈与栈链以及其应用
- Java学习之面向对象三大特征通俗理解
- 【问题解决】Project facet Java version 1.7 is not supported.
- Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串
- 学习windows驱动(32位与64位兼容)
- Singleton单例设计模式
- iOS开发系列--通知与消息机制
- 在iOS7中修改状态栏字体的颜色