1.贪心法中的小心机
挑战P39页贪心法,硬币问题:其中有一步利用了一个小心机:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int V[6]={1,5,10,50,100,500};
int C[6],A;
void solve()
{
int ans=0;
for(int i=5;i>=0;i--){
int t=min(A/V[i],C[i]);
A-=t*V[i];
ans+=t;
}
printf("%d\n",ans);
}
int main()
{
for(int i=0;i<6;i++){
scanf("%d",&C[i]);
}
scanf("%d",&A);
solve();
return 0;
}
在int t=min(A/V[i],C[i]);处。C[i]代表剩余纸币个数,A/V[i],代表需要这个值的纸币的个数。取小避免纸币不够用,还可以尽量实现贪心算法。
2.贪心算法中的区间问题。
在解决参与尽可能多的工作的过程中,利用贪心算法。代码如下:
#include <iostream>
#include <cstdio>
#include <utility>
#include <algorithm>
using namespace std;
const int MAXN=100000;
int N,S[MAXN],T[MAXN];
pair<int,int> itv[MAXN];
void solve()
{
for(int i=0;i<N;i++){
itv[i].first =T[i];
itv[i].second =S[i];
}
sort(itv,itv+N);
int ans=0,t=0;
for(int i=0;i<N;i++){
if(t<itv[i].second){
ans++;
t=itv[i].first;
}
}
printf("%d\n",ans);
}
int main()
{
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d",&S[i]);
}
for(int j=0;j<N;j++){
scanf("%d",&T[j]);
}
solve();
return 0;
}
p1<p2 的定义:两个pair对象之间的小于运算,其定义遵循字典次序,如果p1.first<p2.first或者!(p1.first<p2.first)&&p1.second<p2.second.则返回true。