B. Vitamins

题目链接

题解:先分别求含有维生素ABC的花费,暴力用三个循环遍历每一种组合,当有重复的花费时(即两种维生素甚至三种的饮料相同)需要减去重复花费。

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
#include<stack>
#include<cstring>
#include<string>
#include<ctime>
using namespace std;
typedef long long LL;
struct node
{
	int id, cost;
}temp;
int n;
vector<node>a, b, c;

int cmp(node a, node b) {
	return a.cost < b.cost;
}
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for (int i = 0; i < n; i++) {
		string s;
		cin >> temp.cost >> s;
		temp.id = i;
		for (int j = 0; j < s.size(); j++) {
			if (s[j] == 'A')a.push_back(temp);
			if (s[j] == 'B')b.push_back(temp);
			if (s[j] == 'C')c.push_back(temp);
		}
	}
	LL minc = 1 << 30;
	for (int i = 0; i < a.size(); i++) {
		for (int j = 0; j < b.size(); j++) {
			for (int k = 0; k < c.size(); k++) {
				if (a[i].cost >= minc || b[j].cost >= minc || c[k].cost >= minc)continue;//不符合条件提前进行下一个循环
				LL sumc = a[i].cost + b[j].cost + c[k].cost;
				if (a[i].id == b[j].id)sumc -= a[i].cost;
				if (a[i].id == c[k].id)sumc -= a[i].cost;
				if (b[j].id == c[k].id)sumc -= b[j].cost;
				if (sumc == 0)sumc += a[i].cost;//当上个相同时sumc会减成0,此时需要加上一个cost。
				minc = min(minc, sumc);
			}
		}
	}
	if (minc > 1 << 25)cout << -1;
	else cout << minc;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/leo_10/article/details/82748046
今日推荐