CCF 20170902 公共钥匙盒(只有40分,不知道为什么,求教啊!)

/*
仍然只40分! 
Author:L
Date:2019/3/16 20:40-00:15 
Project:ccf2017/09-2 公共钥匙盒 
*/
#include <iostream>
using namespace std;

class key{
    public:
        int num;//需要的钥匙号 
        int start;//取走 w钥匙号的时间 
        int temp;//w钥匙号需要用多久
        int end;//w钥匙需要还的时间
}; 

int main()
{
    //n把钥匙,k位老师需要用到钥匙 
    int n,k,min_end=0,max_end=0,c[1001];
    cin>>n>>k;
    //存储钥匙的位置 
    int a[1001];
    //存储k位老师需要的钥匙号以及取、还的时间    
    key b[1001];
    for(int i=0;i<k;i++)
    {
        cin>>b[i].num>>b[i].start>>b[i].temp;
        b[i].end=b[i].start+b[i].temp;
    } 
    //初始化钥匙位置 
    for(int j=1;j<=n;j++)
    {
        a[j]=j;
    }
    
    //找到需要还的最早的时刻  b[min_end].end
    for(int i=1;i<k;i++)
    {
        if(b[min_end].end>b[i].end)
            min_end=i;//0
        if(b[max_end].end<b[i].end)
            max_end=i;//1
    } 
        
    //在 小于 b[min_end].end时刻 的需要取钥匙的位置为空。10305
    for(int i=0;i<k;i++)
    {
        if(b[i].start<b[min_end].end)
            a[b[i].num]=0;    
    } 
        
    //在等于 b[min_end].end时刻开始的  num 从小到大依次放进去。
    //在每一个时刻,先还再拿->还钥匙编号从小到大,空位 从左至右, 
    for(int x=b[min_end].end;x<=b[max_end].end;x++)
    { 
        int cc=0;
        //找到 b[min_end].end时刻需要还钥匙的那些num(钥匙号) 
        for(int i=0;i<k;i++)
        {
            if(b[i].end==x) 
            { 
                c[cc]=b[i].num;
                cc++;
            }    
        } 
        
        //c[]中的从小到大排序,共有c个钥匙需要还(冒泡排序)
        for(int j=cc;j>1;j--)
        {    
            for(int i=0;i<j-1;i++)
            {
                if(c[i]>c[i+1]) swap(c[i],c[j+1]);    
            } 
        }

        if(cc!=0)
        {
            //还钥匙
            int d=0;
            for(int i=1;i<=n;i++) 
            {            
                if(a[i]==0)
                {
                    a[i]=c[d];
                    d++;
                    if(d==cc) break;    
                }
            }
        }

        //取钥匙
        for(int i=0;i<k;i++)
        {
            if(b[i].start==x)    
                for(int j=1;j<=n;j++)
                {
                    if(a[j]==b[i].num)
                        a[j]=0;
                }
        } 
    }
    
    //初始化钥匙位置 
    for(int j=1;j<=n;j++)
    {
        cout<<a[j]<<" ";
    }
    return 0;
}

发布了29 篇原创文章 · 获赞 23 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sunshine04/article/details/88609706