#2017 Multi-University Training Contest 2 1003

来源:互联网 发布:单机服装销售软件 编辑:程序博客网 时间:2024/06/11 21:36

Maximum Sequence

题意: 两个数列 {a_ i }, {b_ i},要求{a_ n+1 ~ a_ 2n}的最大和。a_ i 需要满足:从{b_ i}中取出一个数 b_ k(每个元素仅使用一次);使之满足这里写图片描述

分析: 这道题可以看是做是一道 STL 的题目。使用 pair 建立 a_ i - i 与 i 的关系, 然后贪心取最小的 b_ i , 因为可以重复取{ a_ n}中的数,所以用优先队列来维护,保证每次取出来的 a_ i 都尽可能的大。

代码如下:

#include <bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;const ll mod = 1e9 + 7;const ll N = 250010;int a[N],b[N];int main(){    std::ios::sync_with_stdio(false);    std::cin.tie(0);    int n;    while(cin>>n){        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        for(int i=1;i<=n;i++){            cin>> a[i];            a[i] -= i;        }        for(int i=1;i<=n;i++){            cin>> b[i];        }        sort(b+1,b+n+1);        priority_queue< pair<int ,int> > que;        for(int i=1;i<=n;i++){            que.push( make_pair(a[i], i) );        }        ll ans = 0;        for(int i=1;i<=n;i++){            while( que.top().second < b[i] ) que.pop();            ll temp = que.top().first;            que.push( make_pair(temp - (n + i), n+i) );            ans = (ans + temp)%mod;        }        cout<< ans%mod <<endl;    }    return 0;}

JNU
WYC

原创粉丝点击