codeforces 710E

题意:给你一个文本,现在这个文本是空的,你有两种操作,一种是加入或者删除一个字符耗时间x,另外一种操作是对文本复制然后粘贴一份,比如原来有c个字符现在有2*c个字符,耗时间y,要你求生成n个字符的最小时间、

思路:dp[i]代表生成i个字符的最小时间,那么如果i是奇数,那么i这个状态只能由增加一个字符和减少一个字符而来,即dp[i] = min(dp[i-1]+x, dp[i+1]+x),还有本身的状态,而如果i是偶数的话就可以由dp[i-1]+x dp[i+1]+x  dp[i/2]+y,但每次更新完都要做一个预处理、具体看代码

另外dp[1]的值一定是x、

#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef __int64 ll;
const int qq =2e7+10;
const ll MAXN = 1e15+15;
ll dp[qq];
int main(){
	ll n,x,y;scanf("%I64d%I64d%I64d",&n,&x,&y);
	for(int i=0; i<qq; ++i)		dp[i] = MAXN;
	dp[1] = x;
	for(int i=2; i<n+n; ++i){
		if(i%2==1)	dp[i] = min(dp[i], min(dp[i-1]+x, dp[i+1]+x));
		else	dp[i] = min(dp[i], min(dp[i+1]+x, min(dp[i-1]+x, dp[i/2]+y)));
		for(int j=i*2; j<n+n; j=j*2)
			dp[j] = min(dp[j], dp[j/2]+y);
	}
	printf("%I64d\n", dp[n]);
}

这题A出来之后我自己都不信,QAQ ,从来没做出过E题阿,这题前前后后20分种都没花,居然就这么A了, 我不信、

之后也看了大牛们的代码、发现大牛们 i状态的时候是由 i-1或者i/2 状态转移而来  有点没搞懂、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值