201709-2-公共钥匙盒-ccf

题目:http://118.190.20.162/view.page?gpid=T62

解题思路:

/*
        1.把钥匙取走,钥匙位置为空,
        2.把钥匙放回{
            放回时间
            不同时{
              越早越先还  
            }
            同时,{
                1)放钥匙{
                    编号小的先还
                }
                2)取钥匙和放钥匙{
                    先放
                    后取 
                }
        }
        钥匙位置被占
        
}*/

代码:
 

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1005;
struct key
{
    int id;
    int time;
    int flag;//take 0,back 1
};
bool cmp(key a,key b){
    if(a.time!=b.time){
        return a.time<b.time;
    }
    else if(a.flag!=b.flag)
    {
        return a.flag>b.flag;
    }
    else{
        return a.id<b.id;
    }
}
int main(){
 int N,KK;
 cin>>N>>KK;
 int id,s,c;
 vector<key>mykey;
 for(int i=1;i<=KK;i++){
    cin>>id>>s>>c;
    key k;
    k.id=id;
    k.time=s;
    k.flag=0;
    mykey.push_back(k);

    k.id=id;
    k.time=s+c;
    k.flag=1;
    mykey.push_back(k);
 }
 sort(mykey.begin(),mykey.end(),cmp);
 int pk[N+1];
 for(int i=1;i<=N;i++)pk[i]=i;

 for(int i=0;i<mykey.size();i++){
    int id=mykey[i].id,flag=mykey[i].flag;
    if(flag==0){
        for(int j=1;j<=N;j++){
            if(pk[j]==id){
                pk[j]=0;
                break;
            }
        }
    }
    else if(flag==1){
        for(int pj=1;pj<=N;pj++){//从左往右
            if(pk[pj]==0){
                pk[pj]=id;
                break;
            }
        }
    }
 }
 for(int i=1;i<=N;i++){
    cout<<pk[i];
    if(i!=N) cout<<" ";
    else cout<<endl;
 }
return 0;
}

猜你喜欢

转载自blog.csdn.net/lianghudream/article/details/83689795