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");
}
}