CF355B Vasya and Public Transport 题解

Content

\(A\) 要乘坐交通工具,其中公交车的辆数是 \(n\),第 \(i\) 辆公交车的编号为 \(i\),乘坐次数为 \(a_i\);手推车的辆数是 \(m\),每辆手推车的编号为 \(i\),乘坐次数为 \(b_i\)。当地的公交公司给出了 \(4\) 种门票类型:

  • 花费 \(c_1\) 元乘坐一次公交车或者一次手推车。
  • 花费 \(c_2\) 元乘坐同一个编号的公交车或者同一编号的手推车无限次。
  • 花费 \(c_3\) 元乘坐所有公交车或者所有手推车无限次。
  • 花费 \(c_4\) 元乘坐所有公交车所有手推车无限次。

求小 \(A\) 最少要花的钱数。

数据范围:\(1\leqslant c_1,c_2,c_3,c_4,n,m\leqslant 1000,0\leqslant a_i,b_i\leqslant 1000\)

Solution

很显然,编号为 \(i\) 的公交车需要的收费 \(bus_i=\min\{c_2,a_i\cdot c_1\}\),同一编号的手推车需要的收费 \(tro_i=\min\{c_2,b_i\cdot c_1\}\)

因此,乘坐所有的公交车需要收费 \(sumbus=\min\{c_3,\sum\limits_{i=1}^nbus_i\}\),乘坐所有的手推车需要的收费 \(sumtro=\min\{c_3,\sum\limits_{i=1}^mtro_i\}\)

所以,总共的收费 \(ans=\min\{sumbus+sumtro,c_4\}\)

根据这个直接推式子就行。

Code

#include <cstdio>
#include <algorithm>
using namespace std;

int c1, c2, c3, c4, n, m, a, b, sumbus, sumtro;

int main() {
	scanf("%d%d%d%d%d%d", &c1, &c2, &c3, &c4, &n, &m);
	for(int i = 1; i <= n; ++i)	scanf("%d", &a), sumbus += min(c2, c1 * a);
	for(int i = 1; i <= m; ++i)	scanf("%d", &b), sumtro += min(c2, c1 * b);
	return printf("%d", min(min(c3, sumbus) + min(c3, sumtro), c4)), 0;
} 
posted @ 2021-12-21 21:11  Eason_AC  阅读(44)  评论(0)    收藏  举报