王道机试指南7贪心策略

例题7.1鸡兔同笼(北京大学上机)

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int a;
    while(scanf("%d", &a) != EOF){
        if(a % 2 != 0 || a < 2){
            printf("0 0");
        }else{
                printf("%d %d\n", a/4 + (a%4)/2, a/2);
        }
    }
    return 0;
}  

例题7.2代理服务器(清华上机)

#include<iostream>
#include<string>
using namespace std;
int n, m;
string angency[1005], server[5005];
int ans;
//int now;

int find(int num){
    int max = -1;
    for(int i = 0; i < n; i++){
//        if(i == now) continue;
        for(int j = num;; j++){
            if(j == m) return -1;
            if(angency[i] == server[j]){
                if(j > max){
                    max = j;
//                    now = i;
                }
                break;
            }
        }
    }
    ans++;
    return max;
}
int main(){
    while(cin >> n){
//        now = -1;
        ans = 0;
        for(int i = 0; i < n; i++) cin >> angency[i];
        cin >> m;
        for(int i = 0; i < m; i++) cin >> server[i];
        int flag = find(0);
        if(n == 1 && flag != -1){
            cout << -1 << endl;
            continue;
        }
        while(true){
            flag = find(flag);
            if(flag == -1) break;
        }
        cout << ans << endl;
    }
    return 0;
}