今天发现了一个新大陆——CSDN主页,文章蛮好看的(没错这就是我水了20分钟CSDN的理由)
咳咳进入正题
贪心的概念:贪心是一种解题策略,也是一种解题思想,在每次决策(选择)时采取当前意义下最优策略的算法。
利用贪心策略解题,需要解决两个问题:
1.该题是否适合于用贪心策略求解
2.如何选择贪心标准,以得到问题的最优/较优解
所以贪心并不是一种算法而是一种思想(废话)
例题一:在50元和100元面值的人民币出现之前,人民币仅由10元、5元、2元、1元、5角、2角、1角和5分、2分、1分面值的钱币组成。现给定一个10000元以内,精确到1分的人民币数值,请你用最少的钱币张数,找出相应的钱数。
解题思路:只要每次尽量拿最大的钱币,钱币数就一定最小哒
证明方法:显然法。。。
神秘代码:
例题二:HLOJP172
解题思路:将值排序之后将大小结合,两两结合尽量多,因此应把大的与小的放到一起,如果不可以结合就单独一组(大的),能结合的话就合为一组继续
证明方法:天知道。。
神秘代码:不发图不发图
#include<bits/stdc++.h>
using namespace std;
int zs,n,s=0,a[30001];
int main()
{
cin>>zs>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
int i=1,j=n;
while(i<=j)
{
if(a[i]+a[j]<=zs) {
i++; j--; s++;}
else {
j--; s++;}
}
cout<<s<<endl;
return 0;
}
例题三:HLOJP176
解题思路:枚举右端点,从小到大排序,如果一样就看左端点大小,之后看是否香蕉相交,这样策略一定最优
证明方法:反证法:右端点大的与别的线段冲突的概率大,只要和B有冲突的,必然和A有冲突,所以必然不要A
神秘代码:
#include<bits/stdc++.h>
using namespace std;
struct cow
{
int id,left,right;
} a[51000];
int n,bzl,bzr,sum=1;