Educational Codeforces Round 16 E. Generate a String (DP)
Generate a String
题目链接:
http://codeforces.com/contest/710/problem/E
Description
zscoder wants to generate an input file for some programming competition problem.
His input is a string consisting of n letters 'a'. He is too lazy to write a generator so he will manually generate the input in a text editor.
Initially, the text editor is empty. It takes him x seconds to insert or delete a letter 'a' from the text file and y seconds to copy the contents of the entire text file, and duplicate it.
zscoder wants to find the minimum amount of time needed for him to create the input file of exactly n letters 'a'. Help him to determine the amount of time needed to generate the input.
Input
The only line contains three integers n, x and y (1 ≤ n ≤ 107, 1 ≤ x, y ≤ 109) — the number of letters 'a' in the input file and the parameters from the problem statement.
Output
Print the only integer t — the minimum amount of time needed to generate the input file.
Sample Input
```
8 1 1
8 1 10
```
Sample Output
```
4
8
```
##题意:
数num初始时为0,可以用x的花费加一或减一,可以用y的花费乘二,求最小花费变成N.
##题解:
规模这么大,要么是找规律,要么是O(n). 最短路什么的肯定不行了.
这里用我为人人的dp来解决:dp[i]: 达到i的最小花费.
枚举i:对于i有三种拓展方向(加一 减一 乘二).
如果直接进行这三种拓展,肯定存在问题:因为存在减一的操作,所以i的最小值可能会由i+1得来.
考虑一个点i,如果它的最小花费是由比i大的点拓展而来的,那么这个点一定是i+1,且它是一个偶数.
证明:首先,因为比i大只能减一操作,所以最小的一定是i+1.
其次,i+1这个数的来源有三种i,i+2,i/2. 肯定不能是i(否者就重复走了),如果是i+2,那么违背上一个条件(i+2连续减两次到达i),所以一定是i/2通过乘二操作得到i.
综上,我们只要在每次更新2*n时,同时更新2*n-1,即可保证每次枚举到i时,dp[i]都是最小.
这题也可以写成"人人为我"的形式,见代码注释.
##代码:
``` cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define eps 1e-8
#define maxn 10000100
#define mod 100000007
#define inf 0x3f3f3f3f3f3f3f3f
#define mid(a,b) ((a+b)>>1)
#define IN freopen("in.txt","r",stdin);
using namespace std;
LL dp[maxn];
int main(int argc, char const *argv[])
{
//IN;
int n; LL x,y;
while(scanf("%d %I64d %I64d", &n,&x,&y) != EOF)
{
memset(dp, inf, sizeof(dp));
dp[1] = x;
for(int i=1; i<=n; i++) {
dp[i+1] = min(dp[i+1], dp[i] + x);
if(i*2 < maxn) {
dp[i*2] = min(dp[i*2], dp[i] + y);
dp[i*2-1] = min(dp[i*2-1], dp[i*2] + x);
}
}
/*
"我为人人"
for(int i=1; i<=n; i++) {
dp[i] = min(dp[i-1]+x, dp[(i+1)/2]+y+(i%2)*x);
}
*/
printf("%I64d\n", dp[n]);
}
return 0;
}
Educational Codeforces Round 16 E. Generate a String (DP)的更多相关文章
- [Educational Codeforces Round 16]E. Generate a String
[Educational Codeforces Round 16]E. Generate a String 试题描述 zscoder wants to generate an input file f ...
- Educational Codeforces Round 16 E. Generate a String dp
题目链接: http://codeforces.com/problemset/problem/710/E E. Generate a String time limit per test 2 seco ...
- Educational Codeforces Round 20 E - Roma and Poker(dp)
传送门 题意 Roma在玩一个游戏,一共玩了n局,赢则bourle+1,输则bourle-1,Roma将会在以下情况中退出 1.他赢了k个bourle 2.他输了k个bourle 现在给出一个字符串 ...
- CodeForces - 710E Generate a String (dp)
题意:构造一个由a组成的串,如果插入或删除一个a,花费时间x,如果使当前串长度加倍,花费时间y,问要构造一个长度为n的串,最少花费多长时间. 分析:dp[i]---构造长度为i的串需要花费的最短时间. ...
- Educational Codeforces Round 16 D. Two Arithmetic Progressions (不互质中国剩余定理)
Two Arithmetic Progressions 题目链接: http://codeforces.com/contest/710/problem/D Description You are gi ...
- Educational Codeforces Round 22 B. The Golden Age(暴力)
题目链接:http://codeforces.com/contest/813/problem/B 题意:就是有一个数叫做不幸运数,满足题目的 n = x^a + y^b,现在给你一个区间[l,r],让 ...
- Educational Codeforces Round 54 [Rated for Div. 2] (CF1076)
第一次在宿舍打CF 把同宿舍的妹子吵得不行... 特此抱歉QAQ A 题意:给定一个字符串, 最多删掉一个字符,使得剩余字符串字典序最小 n<=2e5 当然"最多"是假的 删 ...
- Educational Codeforces Round 32:E. Maximum Subsequence(Meet-in-the-middle)
题目链接:E. Maximum Subsequence 用了一个Meet-in-the-middle的技巧,还是第一次用到这个技巧,其实这个技巧和二分很像,主要是在dfs中,如果数量减小一半可以节约很 ...
- D Merge Equals Educational Codeforces Round 42 (Rated for Div. 2) (STL )
D. Merge Equals time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...
随机推荐
- CentOS7 源进源出
echo 200 ct >> /etc/iproute2/rt_tablesecho 201 cu >> /etc/iproute2/rt_tables ip route ad ...
- Linux的磁盘配额详解(Quota)
1. 检查内核情况 检查当前内核是否支持quota,当前内核配置文件在/boot下 如果当前内核不支持quota,需要重新编译内核将quota support编译进核心: File systems ...
- SpringBoot整合mybatis碰到的问题
整合mybatis 1. 导包:在原有的web项目的基础上加上 <!--JDBC连接--> <dependency> <groupId>m ...
- c++多线程并发学习笔记(1)
共享数据带来的问题:条件竞争 避免恶性条件竞争的方法: 1. 对数据结构采用某种保护机制,确保只有进行修改的线程才能看到修改时的中间状态.从其他访问线程的角度来看,修改不是已经完成了,就是还没开始. ...
- shell学习笔记2---执行Shell脚本(多种方法)
在新进程中运行 Shell 脚本 1) 将 Shell 脚本作为程序运行 切换到脚本所在位置(还要给脚本加上可执行权限) [mozhiyan@localhost demo]$ ./test.sh #执 ...
- CSUST 8.4 早训
## Problem A A - Memory and Crow CodeForces - 712A 题意: 分析可得bi=ai+ai+1 题解: 分析可得bi=ai+ai+1 C++版本一 #inc ...
- 梯度下降算法(Gradient descent)GD
1.我们之前已经定义了代价函数J,可以将代价函数J最小化的方法,梯度下降是最常用的算法,它不仅仅用在线性回归上,还被应用在机器学习的众多领域中,在后续的课程中,我们将使用梯度下降算法最小化其他函数,而 ...
- JavaScript生成简单数字验证码
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- SQLSERVER还原数据库失败:错误: 3154
在SQL Server 2008版本中还原从sql server 2005备份出来的数据库时,提示错误:“备份集中的数据库备份与现有的 '***' 数据库不同.RESTORE DATABASE 正在异 ...
- Qt项目界面文件(.ui)及其作用(超详细)
http://c.biancheng.net/view/1820.html Qt 项目中,后缀为“.ui”的文件是可视化设计的窗体的定义文件,如 widget.ui.双击项目文件目录树中的文件 wid ...