缓解气氛
个人认为贪心是最容易实现的代码了,虽然他没什么套路可言,但却是只要有了思路,实现起来还是很轻松的。
算法分析
贪心说的就是用贪心的思想去解题,譬如,你要搬家,但是一辆卡车一共有100个空间,你有沙发要20个空间,桌子30个空间,电视35个空间,床60个空间。要求让你一次性多的装在家具。
因为要多,所以如果最先放入的家具越小,留出来的空间就越大。所以,根据贪心的思想,我们就会选沙发,桌子和电视一共需要85个空间,剩余的15个空间就空着吧。因为我们已经没有东西可以放入了。
肯定有人会想,如果尽可能的利用空间岂不是更划算。例如,你要选床和电视,一共95个空间,剩余5个空间。第二次空间利用率虽高但是却不是最优。明显看出第一次装入3个家具,第二次才2个。因为你第一个选的不是最小的。(PS:贪心算法多数需要排序。所以,我们可以运用C++中的sort()函数实现快速排序。具体函数运用百度可查。)
举个栗子
某个国家,决策都是由投票决定。为了提高效率,他们先将所有人分组,首先进行组内决策,然后再进行组与组之间的决策。如果赞同得票数多于(>不是>=)组内一半即小组内赞成。如果有超过(>不是>=)一般的小组是赞成即决策通过。要求求出决策通过的最少赞成人数。
样例输入:
3 //分组个数
5 7 5 //每组内人数
输出:
6
题解
这个题就用到了贪心的思想,首先我们要时刻记得要最少的人赞同,但同时也要通过决策。首先,我们可以考虑,要通过决策一定要2个组,而如果组内人数的基数小,通过决策需要赞成的人数就少。所以,我们要对小组进行排序,即由5
7 5 变为5 5 7,所以我们只需要选前两个小组即是人数基数少的组。在对组内的人数运用贪心即可求得。
代码实现
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
int team[101],i,m,sum=0;
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d",&team[i]);
sort(team,team+m);//sort()函数排序
for(i=0;i<=m/2;i++)
sum += team[i]/2+1;//对决策人数进行计数
printf("%d",sum);
return 0;
}
写在最后
贪心很简单,只需勤加练习。贪心的原理一定要吃透,因为贪心算法,并不是难在代码实现,也不是难在理解。而是对于题目的剖析,要能够看出题目是贪心题目才可能进行代码实现。
2368

被折叠的 条评论
为什么被折叠?



