codeforces|CF13C Sequence】的更多相关文章

大概的题意就是每次可以对一个数加一或者减一,然后用最小的代价使得原序列变成不下降的序列. 因为是最小的代价,所以到最后的序列中的每个数字肯定在原先的序列中出现过.(大家可以想一下到底是为什么,或者简单举几个例子验证一下) 我们用一个c数组拷贝原先的a数组,然后进行从小到大排序. 那么之后我们考虑DP,因为是5000的数据,考虑\(n^2\)做法.设\(dp[i][j]\)表示前i个已经符合要求,而且最大数不大于原序列第j个元素最小需要的代价. 那么我们可以得出转移方程\(dp[i][j]=min…
题目链接:http://codeforces.com/problemset/problem/327/B 这道题目虽然超级简单,但是当初我还真的没有想出来做法,囧,看完别人的代码恍然大悟. #include <cstdio> #include <cstdlib> #include <cmath> int main(void) { int n; scanf("%d", &n); ; i <= n+n; ++i) { printf("…
http://codeforces.com/contest/13/problem/C 题目大意 给定一个含有N个数的序列,要求你对一些数减掉或者加上某个值,使得序列变为非递减的,问你加减的值的总和最少是多少? 思路:所有数最终构成的集合一定是一开始所有数构成数的集合的子集,因此dp[i][j]代表当前第i个数,递增序列在第j个数的代价. #include<cstdio> #include<cstring> #include<cmath> #include<iost…
B. Hungry Sequence time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Iahub and Iahubina went to a date at a luxury restaurant. Everything went fine until paying for the food. Instead of money…
构造题. 我递归构造的,发现如果N>3的话就优先删奇数,然后就把删完的提取一个公约数2,再重复操作即可. 具体原因我觉得是因为对于一个长度大于3的序列,2的倍数总是最多,要令字典序最大,所以就把非2的倍数全删了. 假设不删奇数,剩下的数要提取出来非1的公因数,要删的数一定比删奇数删的起码多1,出现比之前的公因数大的质因数的位置就会往后推,这样字典序就小了. #include <iostream> #include <cstdio> #include <vector>…
题目链接:http://codeforces.com/problemset/problem/13/C 题意: 给定n长的序列 每次操作能够给每一个数++或-- 问最少须要几步操作使得序列变为非递减序列 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.…
Let's call the following process a transformation of a sequence of length nn. If the sequence is empty, the process ends. Otherwise, append the greatest common divisor (GCD) of all the elements of the sequence to the result and remove one arbitrary e…
题意:给出一个 n (1 <= n <= 5000)个数的序列 .每个操作可以把 n 个数中的某一个加1 或 减 1.问使这个序列变成非递减的操作数最少是多少 解法:定义dp[i][j]为将前i个数变为以j为结尾的非递减序列的最少操作次数. 则有: dp[i][j] = min(dp[i][j], min(dp[i][k]) + Cost(原来第i个位置上的数转换到j))  (1 <= k <= j) 即前i个数以j结尾的状态可以由前i-1个数以小于等于j的k结尾的状态转移过来,取…
题目链接:点击打开链接 有一个交换操作比較特殊,所以记录每一个点距离自己近期的那个字符的位置 然后交换就相当于把第一行要交换的2个字符 之间的字符都删掉 把第二行要交换的2个字符 之间的字符都插入第一行的2个字符之间 然后再进行交换. #include <cstdio> #include <cstring> #include<iostream> using namespace std; #define inf 10000000 #define N 4005 #defin…
嘟嘟嘟 偶然看到的这道题,觉得有点意思,就做了. 首先题里说修改后的数列只能出现修改前的数,那么状态之间的转移也就之可能在这些数之间. 令f[i][j]表示第 i 个数改成原序列第 j 小的数时的最小步数.容易得出:f[i][j] = min(f[i - 1][k]) + abs(a[i] - b[j]) (1 <= k <= j),其中a是原序列,b是排好序的序列.这样实现了一个O(n3)的dp. 然而n <= 5000,因此我们必须优化掉一层循环,考虑k那一层:f[i - 1][k]…