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

硬币问题 贪心算法 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值