您的位置:首页 > 其它

CodeForces 416C Booking System

2014-04-16 00:23 337 查看
一道简单的模拟,或者说是贪心,处理的时候比较简单,一开始wa了几次。

主要错的原因在于,没有将订单的消费进行一个排序。

这样照成的结果就是,“挤掉的订单”,是该订单可安排table内中,不是最少消费的。(在安排该订单的时候,可能是最优的,但是,挤掉的时候,却不是最优的)。

那么对消费按高到低排个序,这样安排上的订单肯定是最优的。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;

const int N=1003;
struct Book{
    int number,money;
    int id;
}b
;
struct Table{
    int number,p,maxmoney;
    int id;
}t
;

bool cmp(Table x,Table y){
    if(x.number<y.number) return true;
    else return false;
}

bool cmp1(Book x,Book y){
    if(x.money>y.money) return true;
    else return false;
}

int main(){
    int n;
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++){
            scanf("%d%d",&b[i].number,&b[i].money);
            b[i].id=i;
        }
        sort(b+1,b+1+n,cmp1);
        int m;
        scanf("%d",&m);
        for(int i=1;i<=m;i++){
            scanf("%d",&t[i].number);
            t[i].p=-1;t[i].maxmoney=-1;
            t[i].id=i;
        }
        sort(t+1,t+1+m,cmp);
        for(int i=1;i<=n;i++){
            int pos=-1,min=0xffffff;
            for(int j=1;j<=m;j++){
                if(t[j].number>=b[i].number&&t[j].maxmoney<min){
                    min=t[j].maxmoney;pos=j;
                }
            }
            if(b[i].money>min){
                t[pos].p=b[i].id;
                t[pos].maxmoney=b[i].money;
            }
        }
        int cnt=0,mcnt=0;
        queue<Table> q;
        for(int i=1;i<=m;i++){
            if(t[i].p!=-1){
                cnt++;mcnt+=t[i].maxmoney;
                q.push(t[i]);
            }
        }
        printf("%d %d\n",cnt,mcnt);
        while(!q.empty()){
            printf("%d %d\n",q.front().p,q.front().id);
            q.pop();
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: