博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces - 1042B Vitamins (思维)
阅读量:2136 次
发布时间:2019-04-30

本文共 1323 字,大约阅读时间需要 4 分钟。

题目大意:

       商店出售n中果汁,每种果汁含有一定量的维生素(维生素只有A、B、C三种),每种果汁价格不同,问买果汁使得A、B、C三种维生素被都获取的最低价格是多少

题解:

     最开始我的想法是,先将果汁按照价格从小到大排序,然后依次选择,知道ABC都含有了就break,然后再扫一遍已经选择的果汁,看看如果去掉当前果汁,总共的维生素是否还是都含有ABC,如果是,这个果汁就可以去掉。但是最后发现这个思路是不对的(但是过了23个点,WA24了,也是很神奇)

例如

A 10

B 10 

C 10

ABC 20

显然是选ABC要好过选A+B+C,但是上述的做法就会只选了A+B+C就break了

      这题没法通过排序什么的来贪心做,只能把所有情况都列举出来然后求最小

将所有可能产生ABC的组合都算一遍

ABC

A+B+C

AB+C

A+BC

AC+B

AB+BC

AC+BC

AC+AB

#include
#include
#define ll long long#define INF 1000000007using namespace std;map
_map;int n;int get(string x,string y){ if(_map.count(x)&&_map.count(y)) return _map[x]+_map[y]; return INF;}int main(){ //freopen("input.txt","r",stdin); cin>>n; int cc; string ss; for(int i=1;i<=n;++i) { cin>>cc>>ss; sort(ss.begin(),ss.end()); if(_map.count(ss)==0) { _map[ss]=cc; } else _map[ss]=min(_map[ss],cc); } int ans=INF; if(_map.count("A") && _map.count("B") && _map.count("C")) ans=_map["A"]+_map["B"]+_map["C"]; if(_map.count("ABC")) ans=min(ans,_map["ABC"]); ans=min(ans,get("AB","C")); ans=min(ans,get("A","BC")); ans=min(ans,get("AC","B")); ans=min(ans,get("AB","BC")); ans=min(ans,get("AC","BC")); ans=min(ans,get("AC","AB")); if(ans==INF) ans=-1; cout<
<

 

转载地址:http://akfgf.baihongyu.com/

你可能感兴趣的文章
Leetcode C++ 《第203场周赛》
查看>>
云原生 第十三章 Kubernetes网络概念及策略控制
查看>>
《redis设计与实现》 第一部分:数据结构与对象 || 读书笔记
查看>>
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
算法工程师 面经2019年5月
查看>>
搜索架构师 一面面经2019年6月
查看>>
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
查看>>
Loadrunner之https协议录制回放报错如何解决?(九)
查看>>
python中xrange和range的异同
查看>>