UVA 11292 题解

这题比较简单的,但笔者犯了一个低级错误:在判断是否成功的时候,只考虑了j,而没有考虑i。这个错误在数学上有对应,就是充分必要条件的判断。如果成功,j肯定是在最后的索引,但是j在最后的索引,并不一定成功。

还有一个问题是反应在做题过程中的。提交两次WA之后,仍然怀疑OJ有问题。现阶段别想太多,就是找自身的问题。很多时候,问题往往是出在自己身上,多思考自己有什么问题,往往能更好的解决问题。

代码

#include <bits/stdc++.h>

using namespace std;

#define REP(i, n) for(int _n = n, i = 0; i < _n; i++)
#define FOR(i, a, b) for(int i = (a), _b = (b); i <= _b; i++)
#define RFOR(i, b, a) for (int i = (b), _b = (a); i >= _b; i--)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Abs(x) ((x) > 0 ? (x) :(-(x)))
#define L(fmt, ...) do {if(true) printf(fmt"\n", ##__VA_ARGS__);} while(false)

#define MAXN 20100

long long D[MAXN], K[MAXN];

#define MAX -1LL

int main() {
    int n, m;
    while(scanf("%d%d", &n, &m) && ! (n == 0 && m == 0)) {
        REP(i, n) {
            scanf("%lld", &D[i]);
        }
        REP(i, m) {
            scanf("%lld", &K[i]);
        }

        sort(D, D + n);
        sort(K, K + m);

        D[n] = MAX;
        K[m] = MAX;

        int i, j;
        i = j = 0;
        long long res = 0;

        while (i < n && j < m) {
            if (K[j] >= D[i]) {
                res += K[j];
                i += 1;
                j += 1;
            } else {
                j += 1;
            }
        }

        if (j >= m && i < n) {
            printf("Loowater is doomed!\n");
        } else {
            printf("%lld\n", res);
        }
    }
    return 0;
}

参考

uva11292

Table of Contents