大二算法课课堂算法练习-贪心算法篇(持续更新)

硬币问题 贪心算法 10.15

  • 对于最少的硬币数每次选取最大价值的硬币,价值大的选完了或者不符合情况的再选小的。
  • 对于最小硬币通过转换为计算剩余的价值的硬币数的最大值,即转换为第一个情况。最后再用硬币数做减法即可。
//
//  main.cpp
//  挑硬币_贪心算法
//
//  Created by 陈冉飞 on 2019/10/15.
//  Copyright © 2019 陈冉飞. All rights reserved.
//

#include 
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<<"******* "<
            sum += a[i]*val[i];
            all += a[i];
        }
//        cout<
        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 
#include 
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;
}

你可能感兴趣的:(ACM,贪心算法)