pog loves szh II

HDOJ-5265-pog loves szh IIopen in new window

分析

时,利用双指针扫描法求最大的,记为

,即时,取最大的,记为

答案为

实现

#include <iostream>
#include <algorithm>
using namespace std;

typedef long long LL;
const int N = 100010;
int n, p;
int a[N];

int main () {
    while (cin >> n >> p) {
        for (int i = 1; i <= n; ++ i) cin >> a[i];

        for (int i = 1; i <= n; ++ i) a[i] %= p;
        sort(a + 1, a + n + 1);
        LL res = ((LL)a[n - 1] + a[n]) % p; // 可能是第二种情况

        for (int i = 1, j = n; i <= n; ++ i) {
            while (j > i && (LL)a[i] + a[j] >= p) -- j;
            if (i != j) {
                res = max(res, (LL)a[i] + a[j]);
            } else {
                break;
            }
        }
        cout << res << endl;
    }
    return 0;
}
最后修改于: