貪心

都選最好的

找零問題

/*
 * AP325
 * P-4-1. 少林寺的代幣
*/
#include<bits/stdc++.h>
using namespace std;

int main(){
	int money[4] = {1,5,10,50};
	int n;
	cin >> n;
	for(int i=0;i<n;++i){
		int x;
		cin >> x;
		int cnt = 0;
		int j=3;
		while(x>0){
			if(x>=money[j]){
				x-=money[j];
				cnt+=1;
			}else{
				--j;
			}
		}
		cout << cnt << endl;
	}
}

最大值選擇問題

/*
 * NCOJ
 * 97. [Tutorial] 好吃的蛋糕
*/
#include<bits/stdc++.h>
using namespace std;

struct cmp{
    bool operator()(int a, int b) {
        return a < b;
    }
};
priority_queue<int, vector<int>, cmp> pq;

int main(){
    int n,m;
    cin >> n >> m;
    for(int i=0;i<n;++i){
        int x;
        cin >> x;
        pq.push(x);
    }
    long long sum = 0;
    while(m--){
        sum += pq.top();
        pq.pop();
    }
    cout << sum << endl;
}

最小化總完成時間

/*
 * NCOJ
 * 1072. A.誰先晚餐
*/
#include<bits/stdc++.h>
using namespace std;

struct Dish {
    int c;
    int e;
};

bool cmp(Dish a, Dish b) {
    return a.e > b.e;
}

int main(){
    int n;
    while(cin >> n){
        if(n==0){
            break;
        }
        vector<Dish>v(n);
        for(int i=0;i<n;++i){
            cin >> v[i].c >> v[i].e;
        }
        sort(v.begin(), v.end(), cmp);
        int ans = 0;
        int sum = 0;
        for(int i=0;i<n;++i){
            sum += v[i].c;
            ans = max(ans,sum+v[i].e);
        }
        cout << ans << endl;
    }
}

排程問題 (並行優先)

/*
 * zerojudge
 * b231. TOI2009 第三題:書
*/
#include<bits/stdc++.h>
using namespace std;

struct T{
    int t1;
    int t2;
};

bool cmp(T a,T b){
    return a.t2 > b.t2;
}

int main(){
    int n;
    while(cin >> n){
        vector<T>v(n);
        for(int i=0;i<n;++i){
            cin >> v[i].t1 >> v[i].t2;
        }
        sort(v.begin(),v.end(), cmp);
        int start = 0;
        int t = 0; 
        for(int i=0;i<n;++i){
            start += v[i].t1;
            t = max(t, start + v[i].t2);
        }
        cout << t << endl;
    }
}

Last updated

Was this helpful?