Codeforces 425A Sereja and Swaps(暴力枚舉)
阿新 • • 發佈:2017-06-11
stdio.h acc 題目 operator priority main bool article continue
題目鏈接:A. Sereja and Swaps
題意:給定一個序列,能夠交換k次,問交換完後的子序列最大值的最大值是多少
思路:暴力枚舉每一個區間,然後每一個區間[l,r]之內的值先存在優先隊列內,然後找區間外假設有更大的值就替換掉。
求出每一個區間的最大值,最後記錄下全部區間的最大值
代碼:
By lab104_yifan, contest: Codeforces Round #243 (Div. 2), problem: (C) Sereja and Swaps, Accepted, # #include <stdio.h> #include <string.h> #include <queue> using namespace std; #define INF 0x3f3f3f3f #define max(a, b) ((a)>(b)?(a):(b)) int n, k, a[205], i, j, vis[205]; struct cmp { bool operator() (int &a, int &b) { return a > b; } }; int cal(int l, int r) { priority_queue<int, vector<int>, cmp> Q; int sum = 0, i; for (i = l; i <= r; i++) { sum += a[i]; Q.push(a[i]); } int kk = k; memset(vis, 0, sizeof(vis)); while (kk--) { int maxx = -INF, max_v; for (i = 0; i < n; i++) { if ((i >= l && i <= r) || vis[i]) continue; if (maxx < a[i]) { maxx = a[i]; max_v = i; } } if (Q.top() < maxx) { sum = sum - Q.top() + maxx; Q.pop(); Q.push(maxx); vis[max_v] = 1; } } return sum; } int main() { int ans = -INF; scanf("%d%d", &n, &k); for (i = 0; i < n; i++) scanf("%d", &a[i]); for (i = 0; i < n; i++) for (j = i; j < n; j++) { int t = cal(i, j); ans = max(ans, t); } printf("%d\n", ans); return 0; }
Codeforces 425A Sereja and Swaps(暴力枚舉)