1
> 方法1
#include<cstdio>
#include<stdlib.h>
#include<iostream>
using namespace std;
int a[6]={0};
int b[6]={1,5,10,50,100,500};
int A=0;
int res = 0;
void solve1()
{
int p = 5;//硬币指针
while(A)
{
if(b[p]<=A && a[p]>0)
{
res++;
A-=b[p];
a[p]--;
}
if(b[p]>A || a[p]==0)
{
p--;
}
}
}
int main()
{
for(int i = 0;i < 6;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&A);
solve();
cout<<res<<endl;
system("pause");
return 0;
}
方法2
#include<cstdio>
#include<stdlib.h>
#include<iostream>
using namespace std;
int a[6]={0};
int b[6]={1,5,10,50,100,500};
int A=0;
int res = 0;
void solve()
{
for(int i = 5;i >=0;i--)
{
int t = min(A/b[i],a[i]);
A-=t*b[i];
res+=t;
}
}
int main()
{
for(int i = 0;i < 6;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&A);
solve();
cout<<res<<endl;
system("pause");
return 0;
}
2 调度问题
贪心算法
贪心策略,每次都选结束时间最早的
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define MAX_N 100010
int s[MAX_N]={0};
int n = 0;
int e[MAX_N]={0};
pair<int,int> itv[MAX_N];
void solve()
{
for(int i = 0;i < n;i++)
{
//按照结束时间排序
itv[i].first = e[i];
itv[i].second = s[i];
}
sort(itv,itv+n);
int ans=0,t=0;//t是最后所选工作的结束时间
for(int i = 0;i<n;i++)
{
if(t<itv[i].second)
{
ans++;
t = itv[i].first;
}
}
printf("%d",ans);
}
int main()
{
scanf("%d",&n);
for(int i = 0;i<n;i++)
{
scanf("%d",&s[i]);
}
for(int i = 0;i<n;i++)
{
scanf("%d",&e[i]);
}
solve();
system("pause");
return 0;
}