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 secondsmemory limit per test 512 megabytes
#### 问题描述
> 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.
#### 输入
> 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.
#### 输出
> Print the only integer t — the minimum amount of time needed to generate the input file.
#### 样例
> **sample input**
> 8 1 1
>
> **sample output**
> 4
题意
加减1的消耗是x,乘2的消耗是y,问通过这三个操作把0变成n的最小消耗
题解
贪心+dp
能证明的是偶数都不可能由后面的减回来的,所以即使是奇数也只能由后面的那个偶数减回来,而那个偶数就不用考虑后面再减了。
所以有转移方程:
i是偶数: dp[i]=min(dp[i/2]+y,dp[i-1]+x)
i是奇数: dp[i]=min(dp[i/2+1]+x+y,dp[i-1]+x)
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef __int64 LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
const int maxn=1e7+10;
LL dp[maxn];
int n,x,y;
int main() {
scf("%d%d%d",&n,&x,&y);
dp[1]=x;
for(int i=2;i<=n;i++){
if(i&1){
dp[i]=min(dp[i-1]+x,dp[i/2+1]+y+x);
}else{
dp[i]=min(dp[i/2]+y,dp[i-1]+x);
}
}
prf("%I64d\n",dp[n]);
return 0;
}
//end-----------------------------------------------------------------------
划分阶段,然后先处理乘2,再处理乘加,再处理乘减。(但是感觉还是在偶数不可能通过更大的数减回来的这个结论的基础上做的,可能没有理解清楚吧。。)
阶段1:1~2(dp[1]=x,dp[2]=min(x,y))
阶段2:2~4
...
阶段m:n~n*2
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef __int64 LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
const int maxn=2e7+10;
LL dp[maxn];
int n,x,y;
int main() {
clr(dp,0x3f);
scf("%d%d%d",&n,&x,&y);
dp[1]=x;
dp[2]=min(x+dp[1],y+dp[1]);
for(int cur=2;cur<=n;cur<<=1){
for(int i=cur;i<=cur*2;i++){
if(i%2==0) dp[i]=min(dp[i],dp[i/2]+y);
dp[i]=min(dp[i],dp[i-1]+x);
}
for(int i=cur*2;i>=cur;i--){
dp[i]=min(dp[i],dp[i+1]+x);
}
}
prf("%I64d\n",dp[n]);
return 0;
}
//end-----------------------------------------------------------------------
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)
Generate a String 题目链接: http://codeforces.com/contest/710/problem/E Description zscoder wants to gen ...
- [Educational Codeforces Round 16]D. Two Arithmetic Progressions
[Educational Codeforces Round 16]D. Two Arithmetic Progressions 试题描述 You are given two arithmetic pr ...
- [Educational Codeforces Round 16]C. Magic Odd Square
[Educational Codeforces Round 16]C. Magic Odd Square 试题描述 Find an n × n matrix with different number ...
- [Educational Codeforces Round 16]B. Optimal Point on a Line
[Educational Codeforces Round 16]B. Optimal Point on a Line 试题描述 You are given n points on a line wi ...
- [Educational Codeforces Round 16]A. King Moves
[Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board ...
- Educational Codeforces Round 53 E. Segment Sum(数位DP)
Educational Codeforces Round 53 E. Segment Sum 题意: 问[L,R]区间内有多少个数满足:其由不超过k种数字构成. 思路: 数位DP裸题,也比较好想.由于 ...
- Educational Codeforces Round 9 C. The Smallest String Concatenation 排序
C. The Smallest String Concatenation 题目连接: http://www.codeforces.com/contest/632/problem/C Descripti ...
- Educational Codeforces Round 8 C. Bear and String Distance 贪心
C. Bear and String Distance 题目连接: http://www.codeforces.com/contest/628/problem/C Description Limak ...
随机推荐
- 搭建kafka高级消费 (high-consumer)php7
说明:有很多同学在服务器上搭建好,kafka,在应用端使用kafka时候出现很多问题,这里提供下我的kafka生产和消费的php函数 环境说明: 1:首先php要有kafka扩展,在命令行中输入 ph ...
- PHP接收post请求,不是空数组就是没值,怎么办!
使用: $_POST $_REQUEST I('post.') 都不行, 换成: file_get_contents("php://input");
- Delphi Android下包含第三方DEX
1.将jar转换为dex call dx --dex -verbose --output=.\output\dex\test_classes.dex --positions=lines .\outpu ...
- spark+phoenix
phoenix作为查询引擎,为了提高查询效率,为phoenix表创建了二级索引,而数据是sparkstreaming通过hbase api直接向hbase插数据.那么问题来了,对于phoenix的二级 ...
- 先进先出算法(FIFO)——页面置换
原创 最近操作系统实习,写了先进先出算法(FIFO)的代码来实现页面置换. 题目阐述如下: 设计四:页面置换 设计目的: 加深对请求页式存储管理实现原理的理解,掌握页面置换算法. 设计内容: 设计一个 ...
- 20155310 《Java程序设计》实验四 (Android程序设计)实验报告
20155310 <Java程序设计>实验四 (Android程序设计)实验报告 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Andro ...
- 20155323 2016-2017-2 《Java程序设计》第9周学习总结
20155323 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操 ...
- 2016-2017-2 20155339 《Java面向对象程序设计》实验三敏捷开发与XP实践实验报告
2016-2017-2 20155339 <Java面向对象程序设计>实验三敏捷开发与XP实践实验报告 实验内容 XP基础 XP核心实践 相关工具 实验内容 一.在IDEA中使用工具(Co ...
- 洛谷 P3369 【模板】普通平衡树(Treap/SBT)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...
- FFT&NTT总结
FFT&NTT总结 一些概念 \(DFT:\)离散傅里叶变换\(\rightarrow O(n^2)\)计算多项式卷积 \(FFT:\)快速傅里叶变换\(\rightarrow O(nlogn ...