码迷,mamicode.com
首页 > 其他好文 > 详细

符文能量(Comet OJ - Contest #8)

时间:2019-08-10 17:11:53      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:node   pac   href   printf   情况   can   比赛   int   比较   

给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)

标签:node   pac   href   printf   情况   can   比赛   int   比较   

原文地址:https://www.cnblogs.com/cmath-po8/p/11331983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!