CCF-(201709-2)公共钥匙盒-C语言(100分)

CCF-(201709-2)公共钥匙盒-C语言(100分)_第1张图片CCF-(201709-2)公共钥匙盒-C语言(100分)_第2张图片
把拿钥匙、取钥匙分别作为事件存储,并按照时间点进行排序,然后按顺序处理事件即可。
这里要注意,同一时间点的事件,先归还后借出钥匙,同样是归还钥匙则按钥匙编号排序处理。代码如下:

#include 

typedef struct KEY_USAGE{
     
    int num;
    int get_return;//-1:get 1:return
    int time;
}key_usage;

void swap(key_usage *u1,key_usage *u2){
     
    key_usage a;
    a.num=u1->num;
    a.get_return=u1->get_return;
    a.time=u1->time;
    *u1=*u2;
    *u2=a;
}

void sorting(key_usage usage[],int n){
     
    int i,j;
    for(i=0;i<n-1;i++){
     
        for(j=n-1;j>i;j--){
     
            if(usage[j-1].time>usage[j].time){
     
                swap(&usage[j-1],&usage[j]);
            }
            else if(usage[j-1].time==usage[j].time){
     
                if(usage[j-1].get_return<usage[j].get_return){
     
                    swap(&usage[j-1],&usage[j]);
                }
                else if(usage[j-1].get_return==usage[j].get_return)
                    if(usage[j-1].num>usage[j].num){
     
                        swap(&usage[j-1],&usage[j]);
                    }
            }
        }
    }
}

int main(){
     
    int N,K,i,j,w,s,c;
    scanf("%d%d",&N,&K);
    key_usage usage[K*2];
    int *key;
    key=(int *)calloc(N,sizeof(int));
    for(i=0;i<N;i++){
     
        key[i]=i+1;
    }
    for(i=0;i<K*2;i+=2){
     
        scanf("%d%d%d",&w,&s,&c);
        usage[i].num=w;
        usage[i].get_return=-1;
        usage[i].time=s;

        usage[i+1].num=w;
        usage[i+1].get_return=1;
        usage[i+1].time=s+c;
    }
    sorting(usage,K*2);
    for(i=0;i<K*2;i++){
     
        if(usage[i].get_return==-1){
     //Get
            for(j=0;j<N;j++)
                if(key[j]==usage[i].num){
     
                    key[j]=0;
                    break;
                }
        }
        else{
     //Return
            for(j=0;j<N;j++){
     
                if(key[j]==0){
     
                    key[j]=usage[i].num;
                    break;
                }
            }
        }
    }
    for(i=0;i<N-1;i++){
     
        printf("%d ",key[i]);
    }
    printf("%d",key[i]);
    return 0;
}

你可能感兴趣的:(#,CSP,c语言,csp)