用局部最优的策略来达到全局最优解的效果
简单贪心
PAT1020月饼
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
using namespace std;
struct yue{
double sale;
double re;
};
bool cmp(yue a,yue b){
return a.sale/a.re > b.sale/b.re;
}
int main(){
double num;//月饼的数量
double D;//需求量
double ans = 0;
cin>>num>>D;
vector<yue> l(num);
for(int i = 0;i<num;i++) cin>>l[i].re;
for(int i = 0;i<num;i++) {
cin>>l[i].sale;
}
sort(l.begin(),l.end(),cmp);
for(int i = 0;i<num;i++){
if(D>=l[i].re) {
ans += l[i].sale;
D -= l[i].re;
}else{
ans += D/l[i].re * l[i].sale;
break;
}
}
cout<<fixed<<setprecision(2)<<ans;
return 0;
}
PAT B1023 组个最小数
#include<iostream>
using namespace std;
int main(){
int n[10];
for(int i = 0;i<10;i++){
cin>>n[i];
}
for(int i = 1;i<10;i++){
if(n[i]!=0){
n[i]--;
cout<<i;
break;
}
}
for(int i = 0;i<10;i++){
while(n[i]!=0){
cout<<i;
n[i]--;
}
}
return 0;
}
区间贪心
区间不相交、选点问题
N个开区间,选择尽可能多的区间不重合
N个闭区间,求最少需要多少个点来保证每个闭区间都至少存在一个点
原则就是分类讨论重合的两种情况,得出的结论是优先选择左端点最大的区间。
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
using namespace std;
struct line{
int left;
int right;
};
bool cmp(line a,line b){
return a.left>b.left;
}
int main(){
int N;
cin>>N;
int ans = 0,now;
vector<line> lines(N);
for(int i = 0;i<N;i++)
cin>>lines[i].left>>lines[i].right;
sort(lines.begin(),lines.end(),cmp);
now = lines[0].left;
ans++;
for(int i = 1;i<N;i++){
if(lines[i].right>now) continue; //这里如果是 >= 就变成了区间选点问题
now = lines[i].left;
ans++;
}
cout<<ans;
return 0;
}