您的位置:首页 > 其它

codeforces 710E

2016-09-01 19:02 218 查看
题意:给你一个文本,现在这个文本是空的,你有两种操作,一种是加入或者删除一个字符耗时间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
);
}
这题A出来之后我自己都不信,QAQ ,从来没做出过E题阿,这题前前后后20分种都没花,居然就这么A了, 我不信、

之后也看了大牛们的代码、发现大牛们 i状态的时候是由 i-1或者i/2 状态转移而来  有点没搞懂、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: