题解 CF1829C Mr. Perfectly Fine
cjh20090318 · · 题解
大家好,我是 CQ-C2024 蒟蒻 CJH。
题意
本题有多组数据。
有
如果
请你求出能够学会两个技能所花费的最小时间。如果不能学会,请输出
分析
我们只需要记录能学会的所有状态所花费的最小时间即可。
能够学会两种技能的情况有两种:
- 看了一本能学会两种技能的书。
- 看了两本分别能学会技能
1 和技能2 的书。
代码
//the code is from chenjh
#include<cstdio>
inline int min(const int x,const int y){return x<y?x:y;}
void solve(){
int n;scanf("%d",&n);
int a[4]={1000000000,1000000000,1000000000,1000000000};//因为取最小值,所以要先把每种状态赋值为最大值。
char s[5];
for(int i=1,x,w;i<=n;i++){
scanf("%d%s",&x,s);
w=(s[0]=='1')<<1|(s[1]=='1');//将二进制字符串转化为一个数。
a[w]=min(a[w],x);
}
int ans=min(a[1]+a[2],a[3]);//两种情况的最小值。
printf("%d\n",ans>=1000000000?-1:ans);//答案超过最大值即没有能学会两种技能的方案。
}
int main(){
int T;scanf("%d",&T);
while(T--) solve();
return 0;
}