題目轉送門:http://codeforces.com/problemset/problem/710/E
思路:這是yveh神犇扔給我的,他都懶得做這樣簡單的題QAQ
不過這確實是CF有史以來最傻逼的一道題?
我的傻逼做法:
考慮直接dp,設
考慮暴力轉移有兩種,
考慮優化轉移二,相當於取
一個性質是
所以
所以直接轉移就好了,代碼奇短。
由ISA神犇提供更強做法:
考慮這個操作序列其實是
複雜度在
代碼:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#define N 10000000
using namespace std;
typedef long long LL;
LL f[N + 5],n,x,y;
int main(){
cin>>n>>x>>y;
f[1] = x;
for (int i = 2;i <= n; ++i){
f[i] = f[i - 1] + x;
if (i & 1)
f[i] = min(f[i],f[(i + 1)>>1] + y + x);
else f[i] = min(f[i],f[i >> 1] + y); }
cout<<f[n];
return 0;
}
總結:1.優化轉移的時候考慮某些式子的單調性
2.考慮將操作視爲操作序列,尋找最優操作序列的性質
3.一道題的做法不止一種,也不要滿足於給定的科學的複雜度,要從不同角度理解問題,追求不同的更優的複雜度,努力找出多種做法。