【结论】只不过是长的领带(luogu 6877)
生活随笔
收集整理的這篇文章主要介紹了
【结论】只不过是长的领带(luogu 6877)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
luogu 6877
題目大意
給你n+1個數aia_iai?和n個數bib_ibi?,cic_ici?為不選aia_iai?時,重新調整剩下n個數的位置后,∑i=1nmax(ai?aj)\sum \limits_{i=1}^{n}max(a_i-a_j)i=1∑n?max(ai??aj?)的最小值,求c數組
解題思路
不難發現讓a,b大的對大的,小的對小的可以得到最小值
那么可以先對a,b排序,讓前n個數先匹配,然后把ana_nan?換成an+1a_{n+1}an+1?,因為an+1>ana_{n+1}>a_nan+1?>an?,所以答案只會變大
按這個方法倒著進行一遍就可以求出答案了
代碼
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 200021 using namespace std; int n, b[N], ans[N]; struct node {int v, s, ans; }a[N]; bool cmp(node a, node b) {return a.s < b.s; } bool cmpp(node a, node b) {return a.v < b.v; } int main() {scanf("%d", &n);for (int i = 1; i <= n + 1; ++i){scanf("%d", &a[i].s);a[i].v = i;}for (int i = 1; i <= n; ++i)scanf("%d", &b[i]);sort(a + 1, a + 1 + n + 1, cmp);//排序sort(b + 1, b + 1 + n);for (int i = 1; i <= n; ++i)a[n + 1].ans = max(a[n + 1].ans, a[i].s - b[i]);//前n個匹配for (int i = n; i > 0; --i)a[i].ans = max(a[i + 1].ans, a[i + 1].s - b[i]);//把i換成i+1sort(a + 1, a + 1 + n + 1, cmpp);//排回去for (int i = 1; i <= n + 1; ++i)printf("%d ", a[i].ans);return 0; }總結
以上是生活随笔為你收集整理的【结论】只不过是长的领带(luogu 6877)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 圆脸绑什么头发好看 5款适合圆脸绑起的好
- 下一篇: 不负韶华只争朝夕是什么意思 不负韶华只争