列表

详情


NC239250. CF724E Goods transportation

描述

有直线上 n 个城市,编号为 1..n 。第i个城市生产了 p_i 个货物,在第i个城市最多可以卖掉 s_i 个货物。对于每两个城市 i, j ,如果 ,则可以最多从 i 运送 c 个货物到 j 。注意不能反向运送,却可以在多个城市之间送来送去。现在小明想知道,经过运输后,最多能卖掉多少个货物。

输入描述

第一行两个整数n,c

接下来一行n个整数表示p_i

再一行n个整数表示s_i

输出描述

一个整数表示答案。

示例1

输入:

3 0
1 2 3
3 2 1

输出:

4

示例2

输入:

5 1
7 4 2 1 0
1 2 3 4 5

输出:

12

示例3

输入:

4 3
13 10 7 4
4 7 10 13

输出:

34

原站题解

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

C++(clang++ 11.0.1) 解法, 执行用时: 191ms, 内存消耗: 660K, 提交时间: 2022-09-19 18:00:53

#include<bits/stdc++.h>
using namespace std ;
#define ll long long
const int N = 2e4 + 5 ;
const ll INF = 1ll<<60 ;
int n,c ;
int p[N],s[N] ;
ll f[2][N] ;
int main()
{
	cin>>n>>c ;
	for(int i=1;i<=n;++i) cin>>p[i] ;
	for(int i=1;i<=n;++i) cin>>s[i] ;
	for(int i=1;i<=n;++i) f[0][i]=INF ;
	f[0][0]=0 ;
	ll ans=INF ;
	for(int i=1;i<=n;++i)
	{
		int now=i&1,pre=now^1 ;
		for(int j=0;j<=n;j++) f[now][j]=INF ;
		for(int j=0;j<=i;j++)
		{
			if(j<i) f[now][j]=min(f[now][j],f[pre][j]+s[i]) ;
			if(j>0) f[now][j]=min(f[now][j],f[pre][j-1]+p[i]+((ll)i-j)*c) ;
		}
	}
	for(int i=0;i<=n;++i) ans=min(ans,f[n&1][i]) ;
	cout<<ans<<'\n' ;
	return 0 ;
}

C++(g++ 7.5.0) 解法, 执行用时: 12ms, 内存消耗: 556K, 提交时间: 2022-09-27 16:42:01

#include <iostream>
#include <algorithm>

using namespace std;

using i64 = long long;

const int N = 10010;

int n, c;
int s[N], t[N];
i64 val[N];

int main() {
    cin >> n >> c;
    i64 res = 0;
    for (int i = 1; i <= n; i++) cin >> s[i], res += s[i];
    for (int i = 1; i <= n; i++) cin >> t[i];
    for (int i = 1; i <= n; i++) val[i] = 1ll * (n - i) * c + t[i] - s[i];
    sort(val + 1, val + n + 1);
    i64 ans = 1e18;
    for (int i = 1; i <= n; i++) {
        res += val[i] - 1ll * (i - 1) * c;
        ans = min(ans, res);
    }
    cout << ans << '\n';
    return 0;
}

上一题