UVA11729 Commando War

题目链接

分析:

自己写的时候是直接模拟的,但似乎训练指南上的解法更好。

偶的代码:

View Code
#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;

const int maxn = 1010;

struct Job{
    int b, j;
}a[maxn];

int cmp(const Job &x, const Job &y){
    return x.j > y.j;
}

int main(){
    int n, cnt=0;
    while(cin>>n){
        cnt++;
        if(n == 0) break;
        for(int i=0; i<n; i++) cin>>a[i].b>>a[i].j;
        sort(a, a+n, cmp);

        int ans = 0, t=0;
        for(int i=0; i<n; i++){
            if(t < a[i].b){
                ans += a[i].b - t;
                ans += a[i].j;
                t = a[i].j;
            }
            else{
                t -= a[i].b;
                if(a[i].j > t){
                    ans += a[i].j - t;
                    t = a[i].j;
                }
            }
        }
        cout<<"Case "<<cnt<<": "<<ans<<endl;
    }
    return 0;
}

训练指南上的代码(并不是和书上一样,只是按着思路来写的):

View Code
#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;

const int maxn = 1010;

struct Job{
    int b, j;
}a[maxn];

int cmp(const Job &x, const Job &y){
    return x.j > y.j;
}

int main(){
    int n, cnt=0;
    while(cin>>n){
        cnt++;
        if(n == 0) break;
        for(int i=0; i<n; i++) cin>>a[i].b>>a[i].j;
        sort(a, a+n, cmp);

        int ans = 0, s=0;

        for(int i=0; i<n; i++){
            s += a[i].b;
            ans = max(ans, s+a[i].j);
        }

        cout<<"Case "<<cnt<<": "<<ans<<endl;
    }
    return 0;
}

 

posted on 2013-04-16 13:04  Still_Raining  阅读(243)  评论(0编辑  收藏  举报