硬币问题 贪心算法 10.15
- 对于最少的硬币数每次选取最大价值的硬币,价值大的选完了或者不符合情况的再选小的。
- 对于最小硬币通过转换为计算剩余的价值的硬币数的最大值,即转换为第一个情况。最后再用硬币数做减法即可。
//
// main.cpp
// 挑硬币_贪心算法
//
// Created by 陈冉飞 on 2019/10/15.
// Copyright © 2019 陈冉飞. All rights reserved.
//
#include <iostream>
using namespace std;
int a[6],T,sum,val[5] = {1,5,10,50,100},n,all;
int solve(int t){
int ans = 0,tem;
for (int i = 4; i >= 0 ; i--) {
tem = min(t/val[i],a[i]);
ans += tem;
t -= tem*val[i];
}
if (t) return -1;
return ans;
}
int main(int argc, const char * argv[]) {
for (scanf("%d",&T); T; T--) {
scanf("%d",&n);
sum = 0;all = 0;//init sum
for (int i = 0; i < 5; i++) {
scanf("%d",&a[i]);
// cout<<"******* "<<a[i]<<" "<<val[i]<<endl;
sum += a[i]*val[i];
all += a[i];
}
// cout<<sum<<" "<<all<<endl;
if (solve(n) == -1) printf("-1 -1\n");
else printf("%d %d\n",solve(n),all-solve(sum-n));
}
return 0;
}
活动安排问题 贪心算法 2019.10.20
思路:按照时间的结束时间排序。然后最后再从结束时间找后续事件中可以作为下一个事件。
hdu2307板题
题目解答:
//
// main.cpp
// 活动安排问题_板题
//
// Created by 陈冉飞 on 2019/10/20.
// Copyright © 2019 陈冉飞. All rights reserved.
//
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 105
struct node {
int bg,ed;
bool operator < (const node &a) const{return ed < a.ed;}
}a[maxn];
int n,T,b,c;
void solve(){
int ans = 1,mark = a[0].ed;
for (int i = 1; i < n; i++)
if (a[i].bg >= mark) {
mark = a[i].ed;
ans++;
}
cout<<ans<<endl;
}
int main(int argc, const char * argv[]) {
while (scanf("%d",&n) && n) {
for (int i = 0; i < n; i++) scanf("%d%d",&a[i].bg,&a[i].ed);
sort(a,a+n);
solve();
}
return 0;
}