HUR−Warehouse Store
题目描述见链接 .
正解部分
类似 这道题目, 都是使用堆进行 贪心 .
实现部分
#include<bits/stdc++.h>
#define reg register
typedef long long ll;
typedef std::pair<int,int> pr;
int read(){
char c;
int s = 0, flag = 1;
while((c=getchar()) && !isdigit(c))
if(c == '-'){ flag = -1, c = getchar(); break ; }
while(isdigit(c)) s = s*10 + c-'0', c = getchar();
return s * flag;
}
const int maxn = 1e6 + 5;
int N;
int Ans;
int A[maxn];
int B[maxn];
int main(){
N = read();
for(reg int i = 1; i <= N; i ++) A[i] = read();
for(reg int i = 1; i <= N; i ++) B[i] = read();
std::priority_queue <pr> Q;
ll sum = 0;
for(reg int i = 1; i <= N; i ++){
sum += A[i];
if(sum >= B[i]){
Q.push(pr(B[i], i));
sum -= B[i];
Ans ++;
}else if(!Q.empty()){
int top = Q.top().second;
if(B[top] > B[i]){
Q.pop(), Q.push(pr(B[i], i));
sum += B[top] - B[i];
}
}
}
printf("%d\n", Ans);
int cnt = 0;
while(!Q.empty()) A[++ cnt] = Q.top().second, Q.pop();
std::sort(A+1, A+cnt+1);
for(reg int i = 1; i <= cnt; i ++) printf("%d ", A[i]);
return 0;
}