CodeForces_355B VasyaandPublicTransport ( 贪心 )

文章目录

题目连接 cf or vj

题意

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值