codeforces 1742D

提醒是注意观察题目中每一个被给的范围,从而选择从哪下手,选择哪种复杂度的算法

思路

因为发现数组元素最大只有1000;所以容易想到打一个桶记录每个元素最大的位置,然后 n 2 n^2 n2遍历一遍取最大就行了

ACcode

#include

using namespace std;

using ll = long long;

int b[1001];

void solve() {
    int n;cin >> n;
    vectora(n + 3);
    for (int i = 1;i <= n;i++)cin >> a[i];
    for (int i = 0;i <= 1000;i++)b[i] = 0;
    for (int i = 1;i <= n;i++) b[a[i]] = max(i, b[a[i]]);//记录位置
    int ans = -1;
    for (int i = 1;i <= 1000;i++) {
        if (!b[i])continue;
        for (int j = 1;j <= 1000;j++) {
            if (!b[j])continue;
            if (__gcd(i, j) == 1)ans = max(ans, b[i] + b[j]);
        }
    }
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t;cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

你可能感兴趣的:(算法,c++,数据结构)