CCF 201709-2共通キーボックス(C++100点)

12715 ワード

この問題は非常に詳細を考慮しています.
1.主な考え方:鍵を返し、取り出すことを2つのイベントとして抽象化し、時間ノードによって遍歴する.
2.教師の入力属性が比較的に多く、構造体を設置することを考慮する.
3.読解問題には複数の先生が同時に鍵を返す可能性があるので、鍵番号順に小さい順から大きい順に返す必要があります.そうしないと、40点しか得られません.どうやって知ったのか聞かないでください.
#include
#include
using namespace std;
int n,k;
int key[1001];//     
struct teacher//          
{
    int id;//     
    int b;//       
    int l;//       
    int e;//       
}t[1001];
int main()
{
    int max=0;
    cin>>n>>k;
    for(int i=0;i<k;i++)
    {
        cin>>t[i].id>>t[i].b>>t[i].l;
        t[i].e=t[i].b+t[i].l;//          +     
        if(t[i].e>max)
        max=t[i].e;//max              
    }
    for(int i=1;i<=n;i++)
    {
        key[i]=i;//          
    }
    for(int i=1;i<=max;i++)
    {
        int c[1001];//             (             ,                 ) 
        int cc=0;//          
        for(int j=0;j<k;j++)
        {           
            if(t[j].e==i)//                  
            {
                c[cc]=t[j].id;//               c[cc] 
                cc++; 
            }
        }
        sort(c,c+cc);//                  
        for(int j=0;j<cc;j++)
        {
            for(int m=1;m<=n;m++)
            {
                if(key[m]==0)
                {
                    key[m]=c[j];//                              
                    break;
                }
            }
        }       
        
        for(int j=0;j<k;j++) 
        {
            if(t[j].b==i)
            for(int m=1;m<=n;m++)
            {
                if(key[m]==t[j].id)
                key[m]=0;//                 (     )  0,  ,                      
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        cout<<key[i]<<" ";
    }
    return 0;
}