Codeforces 987C. Three displays(o(n^2))
刚开始三重循环tle test11。后来想了个双重循环的方法。
解题思路:
1.双重循环一次,用一个一位数组存j和比j小的i的和的最小值。
2.再双重循环一次,找到比j大的数k,更新结果为ans=min(ans, k+比j小的i的和的最小值)。
3.如果第二次循环没有更新ans,输出-1;若更新了输出ans。
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define MAX 2000000000 int a[3010]; int c[3010]; int num[3010]; int main(){ ios::sync_with_stdio(false); int n; cin >> n; for(int i = 1;i <= n; ++i) cin >> a[i]; for(int j = 1;j <= n; ++j) cin >> c[j]; int mx = MAX; fill(num,num+3010,MAX); for(int i = 1;i <= n; ++i){ for(int j = i+1;j <= n; ++j){ if(a[i] < a[j]){ num[j] = min(num[j],c[i]+c[j]); } } } int ans = MAX; for(int i = 1;i <= n; ++i){ for(int j = i+1;j <= n; ++j){ if(a[i] < a[j]){ ans = min(ans,num[i]+c[j]); } } } if(ans == MAX) ans = -1; cout << ans << endl; return 0; }