231111-问题 C: 完美先生(Mr. Perfectly Fine)

文章讨论了维克多如何在给定时间内通过阅读书籍获取两种技能,通过计算最短路径找到最经济的策略,若无法获取则输出-1。
摘要由CSDN通过智能技术生成

p.s.个人收录用

题目描述

维克多想成为“完美先生”。为此,他需要获得一定的技能,更准确地说,他有 2 个他需要掌握的技能。
维克多有 n本书。阅读第i本书籍需要花费mi分钟,并将给他一些(可能没有)所需的两个技能,由长度为 2 的二进制字符串表示(1表示获取)。
维克多获得所有这两项技能所需的最短时间是多少?

输入

第一行一个整数t表示测试组数,每组第一行先输入一个整数n(1<=n<=2e5)表示可用的书籍数量,然后是n行,每行包含一个整数mi和一个长度为2的二进制字符串si表示阅读第i本书所花费的时间mi和能否获得两个技能。

输出

对于每个测试样例,输出一个整数,表示维克多获得两个技能所需的最短时间,如果无法获得这两个技能,则输出-1。

样例输入 Copy
6
4
2 00
3 10
4 01
4 00
5
3 01
3 01
5 01
2 10
9 10
1
5 11
3
9 11
8 01
7 10
6
4 01
6 01
7 01
8 00
9 01
1 00
4
8 00
9 10
9 11
8 11
样例输出 Copy
7
5
5
9
-1
8
代码
#include <stdio.h>
#include <string.h>

//完美先生(Mr. Perfectly Fine)

long long int n;
int a[10000] = { 0 };
char m[10000][4] = {0};

int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%lld", &n);
		for (int i = 0; i < n; i++)
		{
			scanf("%d %s", &a[i], m[i]);
		}
		int t1 = 1000; int t2 = 1000; int t0 = 1000;
		for (int i = 0; i < n; i++)
		{
			if (m[i][0] == '0' && m[i][1] == '1')
			{
				if (t1 > a[i])
					t1 = a[i];
			}
			else if (m[i][0] == '1' && m[i][1] == '0')
			{
				if (t2 > a[i])
					t2 = a[i];
			}
			else if (m[i][0] == '1' && m[i][1] == '1')
			{
				if (t0 > a[i])
					t0 = a[i];
			}
		}
		if ((t1 != 1000 && t2 != 1000) || t0 != 1000)
		{
			printf("%d\n", ((t1 + t2) < t0 ? (t1 + t2) : t0));
		}
		else
			printf("-1\n");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值