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 0x3f3f3f3f
using 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