优先队列+贪心
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> using namespace std; struct node { int D; int P; bool operator <(node b) const { return P>b.P; } }Node[100001]; bool cmp1(int a,int b) { return a>b; } bool cmp2(node a,node b) { return a.D>b.D; } int main() { int N,M; while (scanf("%d",&N)!=EOF) { priority_queue<node> q; scanf("%d",&M); int B[100001]; int i; for (i=0;i<=N-1;i++) scanf("%d",&B[i]); for (i=0;i<=M-1;i++) scanf("%d",&Node[i].D); for (i=0;i<=M-1;i++) scanf("%d",&Node[i].P); sort(B,B+N,cmp1); sort(Node,Node+M,cmp2); int pos=0,counter=0; __int64 ans=0; while(!q.empty()) q.pop(); for (i=0;i<=N-1;i++) { while (pos<=M-1 && Node[pos].D>=B[i]) { q.push(Node[pos]); pos++; } if (!q.empty()) { ans+=q.top().P; counter++; q.pop(); } else break; } if (counter!=N) printf("No\n"); else printf("%I64d\n",ans); } return 0; }