符文能量(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

猜你喜欢

转载自www.cnblogs.com/cmath-po8/p/11331983.html