题意
Vasya 所在城市的交通工具有两种类型:手推车和公共汽车。
其中公共汽车有 n 辆,手推车有 m 辆。
公共汽车的编号为 a1,a2,…an,手推车的编号为 b1,b2,…bn
交通工具的门票有 4 种类型:
1: 乘坐某辆 公共汽车 或 某辆手推车的车票, 它需要 c1 元
2: 在某些 公共汽车 或 某些 手推车上无限次乘坐的车票, 它需要 c2 元
3: 所有公共汽车 或 所有手推车上无限次乘坐的车票, 它需要 c3 元
4: 所有公共汽车 和 所有手推车上无限次乘坐的车票, 它需要 c4 元。
输入格式:
第一行包含 4 个整数: c1,c2,c3,c4
第二行包含 2 个整数: n,m
第三行包含 n 个整数: a1…an
第四行包含 m 个整数: b1…bm
输出格式:
一个整数,即 Vasya 所要支付的最少钱数
数据规模:
1 <= c1,c2,c3,c4,n,m <= 1000
0 <= ai,bi <= 1000
题解
首先需要明确的是,
第一种票是单程票, 每乘坐一辆汽车或者推车, 都需要买一张,
第二种票. 是某一辆车可以无限做, 但其实车有很多的, 所以没每次需要和第一种票比较价格, 取得最小值,
第三种票, 就是 一类车可以无线坐,
第四种票, 是所有车都可以无限坐
这个人肯定只能乘坐一种交通工具所以选择第三和第四种票其实无所谓了, 一个是选择一种无限次数乘坐, 另一个是两种都可以选择无限次数乘坐, 就实际意义来说这个人只能乘坐一辆来说, 其实都一样了 .
而只有第一种票和第二种票是每辆车都需要付费的,
由此可见,需要取得最优解就需要枚举第一类票和第二类票怎么才能取得最小值, 最后和会无限坐的票 c3, c4 比较取最小即为所求
代码
#include <bits/stdc++.h>
using namespace std;
#define rg register
#define sc scanf
#define pf printf
const int MAXN = 1e3+10;
int buses[MAXN], trolleys[MAXN];
int main ( ) {
int c1, c2, c3, c4,
n, m;
while ( ~ sc ( "%d%d%d%d", &c1, &c2, &c3, &c4 ) ) {
sc ( "%d%d", &n, &m );
for ( int i = 0; i < n; i++ )
sc ( "%d", &buses[i] );
for ( int i = 0; i < m; i++ )
sc ( "%d", &trolleys[i] );
int sumBuses = 0;
for ( int i = 0; i < n; i++ ) {
if ( buses[i]*c1 <= c2 )
sumBuses += buses[i]*c1;
else
sumBuses += c2;
}
int sumTrolleys = 0;
for ( int i = 0; i < m; i++ ) {
if ( trolleys[i]*c1 <= c2 )
sumTrolleys += trolleys[i]*c1;
else
sumTrolleys += c2;
}
int minBuses = min ( sumBuses, c3 );
int minTrolleys = min ( sumTrolleys, c3 );
int ans = min ( (minBuses+minTrolleys), c4 );
pf ( "%d\n", ans );
}
return 0;
}