2013年11月7日 星期四

[ZJ] a834: 4、卡牌游戏


#include<stdio.h>
#include<vector>
#include<list>
#include<algorithm>
using namespace std;
struct P{
    int t,x;
};
vector<int> A;
vector<P> C,D;
int cmp(P a,P b){
    if(a.x!=b.x) return a.x<b.x;
    return a.t<b.t;
}
char s[10];
int arr[100005],sta[200005],fnt=0,bak=0;
int main(){
    int n,m,x,y,i,j,l,r,add=0;
    long long int ans=0,p=0,k=0;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++){
        scanf("%s %d",s,&x);
        if(s[0]=='A') A.push_back(x),C.push_back((P){1,x});
        else C.push_back((P){3,x});
    }
    D=C;
    for(i=0;i<m;i++)
        scanf("%d",&arr[i]),C.push_back((P){2,arr[i]});
    sort(A.begin(),A.end());
    sort(C.begin(),C.end(),cmp);
    sort(D.begin(),D.end(),cmp);
    for(i=C.size()-1;i>=0;i--){
        if(C[i].t==1 && fnt!=bak)
            p+=sta[fnt++]-C[i].x,add++;
        if(C[i].t==3 && fnt!=bak && sta[bak-1]>C[i].x) bak--,add++;
        if(C[i].t==2) sta[bak++]=C[i].x;
    }

    /*for(i=0,l=0,r=m-1;i<D.size();i++){
        if(C[i].t==1 && fnt!=bak)
            k+=arr[fnt++]-C[i].x,add++;
        if(C[i].t==2 && fnt!=bak && sta[bak-1]>C[i].x) bak--,add++;
    }*/
    while(add==n && fnt!=bak)
        p+=sta[fnt++];
    sort(arr,arr+m);
    l=0,r=m-1;
    for(i=0;i<A.size() && r>=0 && arr[r]>=A[i];i++)
        ans+=arr[r--]-A[i];
    if(ans>p)
    printf("%lld\n",ans);
    else printf("%lld\n",p);
}

沒有留言:

張貼留言