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

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

时间: 2024-10-04 03:03:26

符文能量(Comet OJ - Contest #8)的相关文章

Comet OJ - Contest #5

Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下,最大的满足条件的\(x\)不会太大 因为当\(x\)越来越大时\(f(x)\)的增长速度比\(x\)的增长速度慢得多 其实可以证明,最大的满足的\(x\)不会超过\(100\) 因为没有任何一个三位数的各位之和大于等于\(50\) 所以我们就直接预处理\(1-99\)所有的合法的 暴力枚举即可 其实

Comet OJ - Contest #10 B

Comet OJ - Contest #10 B 沉鱼落雁 思维题 题意 : 每个数字最多重复出现三次,有n给数字,让你尽可能的使得相同数字之间的最小距离尽可能大 思路 :分三种情况套路 设 a b c 分别代表出现 一次, 两次, 三次 数字的个数 所有元素至多出现一次,答案为 n,题目规定 所有元素至多出现两次, 例如 1 1 2,可以排列成 1 2 1,所以,答案为 1 例如 1 1 2 2 3,可以排列成 1 2 3 1 2,所有 答案为 2 思考后得出,应该尽可能的把 b 个出现两次的

Comet OJ - Contest #7 解题报告

传送门:https://www.cometoj.com/contest/52 A:签到题 题意:多次询问,每次询问给出一个值域区间[l,r],从这区间范围中选出两个整数(可重复),依次求出这俩数的“最大的最小公倍数”.“最小的最小公倍数”.“最大的最大公约数”.最小的最大公约数. 分析:(1)显然,当区间长度为1时,该问题的答案只能是区间中仅有的那个数. (2)当区间的长度大于1时,最大的最小公倍数,lcmmax =lcm(ar,ar-1) = ar * ar-1: 最小的最小公倍数,lcmmi

Comet OJ - Contest #15

https://cometoj.com/contest/79/problem/D?problem_id=4219 题目描述 ※ 简单版与困难版的唯一区别是粗体字部份和 $v$ 的数据范围. 在双 11 时,心慧精品店有个特别的折价活动如下: 首先,我们定义一个正整数为"好的"当且仅当此数仅由数字 1 构成,举例来说 1, 11, 111, 11111 都是「好的」,但 10.123.321 都是「不好的」. 接着,若一个商品原价为 x,若顾客能把 x 表示为 k 个「好的」数字,那么此

Comet OJ - Contest #15题解

A 双十一特惠 (简单版) n  <=  1e19,   1e9 > 1(8) https://www.cometoj.com/contest/79/problem/A?problem_id=4198 #include<bits/stdc++.h> using namespace std; int main(){ int t; cin >> t; while(t--) { int cnt1 = 0; int n;cin >> n; int pr[] = {1

Comet OJ - Contest #0

A:化成x-√n=y+z-√4yz的形式,则显然n是完全平方数时有无数组解,否则要求n=4yz,暴力枚举n的因数即可.注意判断根号下是否不小于0. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long

Comet OJ - Contest #1

A:随便怎么暴力. #include<bits/stdc++.h> using namespace std; #define ll long long #define N 25 char getc(){char c=getchar();while (c!='.'&&c!='#') c=getchar();return c;} int gcd(int n,int m){return m==0?n:gcd(m,n%m);} int read() { int x=0,f=1;char

Comet OJ Contest #2

A:暴力,显然每两次至少翻一倍. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;} in

Comet OJ Contest #3

A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 #define N 510 char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}