符文能量(Comet OJ - Contest #8)
Posted cmath-po8
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了符文能量(Comet OJ - Contest #8)相关的知识,希望对你有一定的参考价值。
给Comet OJ打个小广告,挺好用的,比较简洁,给人感觉很好用
Contest #8是我打的第一场本oj比赛,很遗憾A了前两道傻逼题就没思路了,然后就不打算打了.......
https://www.cometoj.com/contest/58/problem/C?problem_id=2760
怎么做啊完全不会啊我那么菜,虽然看到是dp但嫌太麻烦就放弃了;
靠后仔细想了想原来这道题很简单;
结构体node e[];储存ai,bi值(当然你用数组我也不拦着),因为合并的方式很特殊,可以不管合并的顺序,由于k可以为负数,考虑三种情况dp[maxn][3]
dp[i][1]表示在不使用法力情况下,i位释放的能量;
dp[i][2]表示到第i位施法,可知有两种情况:
①到第i位,第i-1位也被施法,所以dp[i][2]=dp[i-1][2]+k*e[i].a*k*e[i-1].b;
②到第i位,第i-1位未被施法,所以dp[i][2]=dp[i-1][1]+k*e[i].a*e[i-1].b(由dp[][1]转移,i-1未被施法);
dp[i][3]表示到第i位不施法,可知也有两种情况:
①到第i位,第i-1位被施法,所以dp[i][3]=dp[i-1][2]+e[i].a*k*e[i-1].b(由dp[][2]转移,因为i-1被施法,所以是dp[][2]);
②到第i位,第i-1未被施法,所以dp[i][3]=dp[i-1][3]+e[i].a*e[i-1].b;
对每种状态的分支算出结果取min();输出结果时也对三种状态取min();
代码如下:
1 #include<bits/stdc++.h> 2 #define re register 3 #define il inline 4 typedef long long ll; 5 6 using namespace std; 7 8 ll n,k,tu[100010][4]; 9 struct node 10 ll a,b; 11 e[100010]; 12 /* 13 Author:cmathpo8; 14 OJ:Comet OJ Contest #8 C 15 */ 16 int main() 17 //freopen(".in","r",stdin); 18 //freopen(".out","w",stdout); 19 scanf("%lld%lld",&n,&k); 20 for(re ll i=1;i<=n;i++) 21 scanf("%lld%lld",&e[i].a,&e[i].b); 22 23 for (ll i = 1; i <= n; ++i) 24 tu[i][1]=e[i].a*e[i-1].b+tu[i-1][1]; 25 tu[i][2]=min(tu[i-1][2]+k*k*e[i].a*e[i-1].b,tu[i-1][1]+k*e[i].a*e[i-1].b); 26 tu[i][3]=min(tu[i-1][3]+e[i].a*e[i-1].b,tu[i-1][2]+e[i].a*k*e[i-1].b); 27 28 ll sum=min(tu[n][1],min(tu[n][2],tu[n][3])); 29 printf("%lld",sum); 30 return 0; 31
qwq
以上是关于符文能量(Comet OJ - Contest #8)的主要内容,如果未能解决你的问题,请参考以下文章