列表

详情


NC54756. zn大冒险

描述

从前有一位聚聚zn带着挂件wnm游历中国的各个宝地,只要通过了宝地守护神的考验,就能获得丰厚的金钱奖励和无穷无尽的小姐姐,每次zn聚聚都凭借强悍的实力和过硬的心里素质带着挂件wnm通过考验,但这一次却让zn聚聚犯了难。

宝地守护神的考验是这样的:现在有`n`块能量宝石,每块宝石都蕴含着能量,能量是由一个二元组构成`(a_i,b_i)`,而这些宝石是可以融合的,并且在融合的过程中会释放出大量的能量(只有相邻的宝石可以融合)。融合规则是:存在两个相邻的宝石`(a_1,b_1)和(a_2,b_2)`,如果融合这两个宝石,宝石就会变成`(a_1,b_2)`并释放出``的能量,现在要找到融合成一块宝石并且产生能量最大的方案。

这个问题对于zn聚来说当然轻松解决,但是宝地守护神却要两个人都解决这个问题才能得到奖励,并且守护神对wnm增加了考验的难度,wnm需要从n个宝石里选择一段连续的区间进行增幅,增幅是让宝石的能量乘上k倍,即`(x,y)`会变成`(kx,ky)`,缺少了pjb聚聚的帮助,zn陷入了麻烦,好在wnm可以作弊,他找到了聪明的你,你能帮助他们得到金钱和小姐姐吗?

输入描述

第一行有2个整数``

接下来有n行 每一行有两个整数``

输出描述

输出一个整数表示所能产生的最大能量。

示例1

输入:

3 5
1 2
5 5
3 4

输出:

625

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 320ms, 内存消耗: 55240K, 提交时间: 2019-12-11 20:04:16

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 7;
typedef long long ll;
ll a[maxn], b[maxn], dp[maxn][5];
int main()
{
    ll n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
        scanf("%lld%lld", &a[i], &b[i]);
    for (int i = 2; i <= n; i++) {
        dp[i][0] = dp[i - 1][0] + b[i - 1] * a[i];
        dp[i][1] = dp[i - 1][0] + k * b[i - 1] * a[i];
        dp[i][2] = max(dp[i - 1][1], dp[i - 1][2]) + k * k * b[i - 1] * a[i];
        dp[i][3] = max(dp[i - 1][2] + k * b[i - 1] * a[i], dp[i - 1][3] + b[i - 1] * a[i]);
    }
    cout << max(dp[n][0], max(dp[n][2], dp[n][3]));
    return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 387ms, 内存消耗: 55180K, 提交时间: 2023-03-13 21:01:12

#include<bits/stdc++.h>

using namespace std;
long long int a[1000005],b[1000005],dp[1000005][5];
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i]>>b[i];
    for(int i=2;i<=n;i++)
    {
        dp[i][0]=dp[i-1][0]+b[i-1]*a[i];
        dp[i][1]=dp[i-1][0]+k*b[i-1]*a[i];
        dp[i][2]=max(dp[i-1][1],dp[i-1][2])+k*k*b[i-1]*a[i];
        dp[i][4]=max(dp[i-1][2]+k*b[i-1]*a[i],dp[i-1][4]+b[i-1]*a[i]);
    }
    cout<<max(dp[n][0],max(dp[n][2],dp[n][4]));
}

C++11(clang++ 3.9) 解法, 执行用时: 785ms, 内存消耗: 63768K, 提交时间: 2020-02-25 14:49:20

#include<bits/stdc++.h>
using namespace std;
long long int a[1000005],b[1000005],dp[1000005][5];
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	cin>>a[i]>>b[i];
	for(int i=2;i<=n;i++)
	{
		dp[i][0]=dp[i-1][0]+b[i-1]*a[i];
		dp[i][1]=dp[i-1][0]+k*b[i-1]*a[i];
		dp[i][2]=max(dp[i-1][1],dp[i-1][2])+k*k*b[i-1]*a[i];
		dp[i][4]=max(dp[i-1][2]+k*b[i-1]*a[i],dp[i-1][4]+b[i-1]*a[i]);
	}
	cout<<max(dp[n][0],max(dp[n][2],dp[n][4]));
}

上一题