这周主要看了看贪心算法,了解其中的中心思想。贪心算法,顾名思义,就是解决问题的过程中要贪心,通过几次的贪心的选择,寻找到最优的的结果。这是一种思想,而非什么函数啥的。贪心算法并不是从整体去找最优解,而是把整体分成一个个小部分,寻找局部的最优解。如果一个问题可以用好几种方法去解决,那贪心算法我们应优先使用。我对贪心算法主要的理解已经在周三的博客上报告了,这几天也没能对贪心算法有更深刻的理解,但解决了几道题,感觉还不错。下面是其中一道。 林赛是个购物狂。每当有打折的时候,你可以买三件,只付两件,她就会完全疯了,觉得有必要把店里所有的东西都买下来。你已经放弃了医治她的这种病,但设法限制它对她钱包的影响。 你已经意识到,提供这些优惠的商店在选择哪些商品是免费的方面是相当挑剔的;它总是最便宜的。例如,当你的朋友带着7件商品来到柜台,花费400、350、300、250、200、150和100美元时,她将不得不支付1500美元。在这种情况下,她得到了250美元的折扣。你意识到如果她去柜台三次,她可能会得到更大的折扣。如果她买的是400、300和250美元的商品,她第一轮就能得到250美元的折扣。下一轮她带来了150美元的商品,没有额外的折扣,但第三轮她拿走了350美元、200美元和100美元的最后一批商品,再打100美元的折扣,总共是350美元。 你的工作是找到林赛能得到的最大折扣。 输入 第一行输入给出了测试场景的数量,1 t Lindsay购买的商品数量,1 n pi Lindsay可以获得的最大折扣,方法是有选择地选择她同时带来的商品。 样例输入 1 6 400 100 200 350 300 250 样例输出 400 #include<iostream> #include<cmath> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll a[30000]; int cmp(int a,int b) { return a>b; } int main() { int n,x,s=0; cin>>n; for(int i=1;i<=n;i++) { cin>>x; for(int i=1;i<=x;i++) { cin>>a[i]; } sort(a+1,a+x+1,cmp); for(int i=1;i<=x;i++) { if(i%3==0) s+=a[i]; } cout<<s<<endl; sum=0; } return 0; } 这道题其实很简单,也是我解决的第一道贪心的题,写下来留作纪念。