贪心算法的应用
考虑最大利润
输入:种类数、需求量、各种类的库存量、各种类的总价
输出:最大利润
#include <iostream>
#include <algorithm>//调用sort排序
using namespace std;
struct mooncake{
double store;
double price;
double tprice;
}cake[1000];
bool cmp(mooncake a,mooncake b)
{
return a.price>b.price;
}
int main(){
int kinds;
double needs,profits=0;
cin>>kinds>>needs;
for(int i=0;i<kinds;i++)
cin>>cake[i].store;
for(int i=0;i<kinds;i++)
{
cin>>cake[i].tprice;
cake[i].price=cake[i].tprice/cake[i].store;
}
sort(cake,cake+kinds,cmp);//由大到小排序
for(int i=0;i<kinds;i++){
if(cake[i].store<=needs)//供应充足
{
needs-=cake[i].store;//更新需求量
profits=cake[i].tprice;
}else{//供应不足:一定要手动结束,否则会继续循环
profits+=cake[i].price*needs;//由单价一个个算出
break;//手动结束
}
}
cout<<profits;
return 0;
}
考虑最小数
输入:0-9位数的次数
输出:由该数所组成的最小数
#include <iostream>
using namespace std;
int main(){
int count[10];//分别记录0-9的个数
for(int i=0;i<10;i++)
cin>>count[i];
for(int i=1;i<10;i++)//先确定首位
if(count[i]>0)
{
cout<<i;
count[i]--;
break;
}
//直接由0-9一个个输出
for(int i=0;i<10;i++)//循环各个位数
for(int j=0;j<count[i];j++)//判断每个位数的次数
cout<<i;
return 0;
}
统计不相交的区间个数-区间贪心
输入:区间个数、各区间的左右端点
输出:不相交的区间个数
#include <iostream>
#include <algorithm>//sort方法
using namespace std;
struct interval{//定义区间结构体
int left;
int right;
}inter[100];
bool cmp(interval a,interval b){
if(a.left!=b.left) return a.left>b.left;//左端点由大到小排序
else return a.right<b.right;//右端点由小到大排序
}
int main(){
int n;
int count=1;//记录不相交的区间个数
cin>>n;
for(int i=0;i<n;i++)
cin>>inter[i].left>>inter[i].right;
sort(inter,inter+n,cmp);
int lastval=inter[0].left;//存最大的:最右端的左端点
for(int i=1;i<n;i++)
if(inter[i].right<=lastval)//右端点小于左端点,说明这两个区间不相交
{
lastval=inter[i].left;//更新左端点
count++;
}else count--;
cout<<count<<endl;
return 0;
}
贪心算法:考虑当前情况下局部最优的策略,从而使全局达到最优的方法