CCF 201709-2 公共钥匙盒

代码如下:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct key{
    int w;      //钥匙号 
    int s;      //钥匙开始使用时间 
    int e;      //钥匙结束使用时间 

    key() {w=0, s=0, e=0;}
    key(int ww, int ss, int ee):w(ww),s(ss),e(ee) {}    
};

bool Order(key& k1, key& k2)
{
    return k1.w < k2.w;
}


int main()
{
    vector<key> info;           //输入信息 
    vector<int> usefulTime;     //有用的时间点,不用每分钟查一次 
    int pothook[1001] = {1};    //挂钩,
    // pothook[i]=j 意味着第i(i>=1)个挂钩上的钥匙编号为j .若无钥匙,则j=0; 
    int N, K;
    freopen("t1.txt","r", stdin);
    cin>>N>>K;

    for(int i=1; i<= N; i++) pothook[i] = i;

    for(int i=0; i<K; i++)
    {
        int w,s,c;
        cin>>w>>s>>c;
        info.push_back(key(w,s,c+s));
        usefulTime.push_back(s);
        usefulTime.push_back(c+s);
    }

    sort(usefulTime.begin(), usefulTime.end());//排序 
    usefulTime.erase(unique(usefulTime.begin(), usefulTime.end()), usefulTime.end());
    //去除重复元素

    //依次看有用时间 
    for(int pp=0; pp< usefulTime.size(); pp++)
    {
        int t = usefulTime[pp];

        //先还钥匙 
        vector<key> vk;                 //还的钥匙 ,可能多个 
        for(int j=0; j< info.size(); j++)
        {
            if(info[j].e == t)
                vk.push_back(info[j]);
        }

        sort(vk.begin(), vk.end(), Order);//按钥匙号排序

        for(int k=0; k<vk.size(); k++)
        {
            for(int p=1; p<= N; p++)
            {
                if(!pothook[p])
                {
                    pothook[p] = vk[k].w;
                    //cout<<"ti:"<<t<<" pothook["<<p<<"]:"<<pothook[p]<<endl;
                    break;
                }
            }
        }


        //借钥匙,相应位置变成零 
        for(int p=0; p< info.size(); p++)
        {
            if(info[p].s == t)
            {
                int pos;
                for(int i=1; i<=N; i++)
                    if(pothook[i] == info[p].w)
                    {
                        pos = i;
                        break;
                    } 
                pothook[pos] = 0;
                //cout<<"to:"<<t<<" pothook["<<info[p].w<<"]:"<<pothook[info[p].w]<<endl;
            }
        }       
    }

    for(int i=1; i<=N; ++i)
        cout<< pothook[i] << " ";

    return 0;
}

猜你喜欢

转载自blog.csdn.net/gengli2017/article/details/82086153