ccf公共鑰匙盒
阿新 • • 發佈:2019-02-05
題目描述見圖片,如下
題目輸入,見圖片
題目分析
1.對操作進行模擬。對於操作順序,題目中很明確給出每次還鑰匙的時候,還到最左邊的空位上,如果同時還鑰匙,按照編號還,如果同時取和還,先還再取。那麼這麼一看就是三重結構體排序。對於結構體的構建,需要三個屬性:操作時間,操作鑰匙編號,操作標誌。看好,這裡是操作時間,並不是取鑰匙時間和還鑰匙時間,是放在一起啦,所以是操作時間。因此,對於每一個輸入,都需要把輸入變成兩個操作,取鑰匙和還鑰匙。例如對於輸入4 3 3 ,則分解成id=4,s=3,flag=0和id=4,e=3+3=6,flag=1.只要將全部輸入變成全部操作後,才能利用結構體排序。結構體排序按照操作時間,操作標誌,要是編號進行排序。
2.對鑰匙進行模擬。操作順序確定後,就要對鑰匙進行模擬,無非就是取鑰匙和還鑰匙。在取鑰匙時,對於相應的位置,置為0,代表空。還鑰匙時從左到右遍歷一遍,找到第一個空位置,將編號重置即可。
題目程式碼如下:
#include <iostream>
#include <algorithm>
#include <vector>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
struct key{
int kid,time,flag;//鑰匙編號,操作時間,操作標誌
};
bool compare1(key k1,key k2){
if(k1.time!=k2.time){//操作時間,小的先操作
return k1.time<k2.time;
}
else if(k1.flag!=k2.flag){//先還在取,還為1,取為0
return k1.flag>k2.flag;
}
else{
return k1.kid<k2.kid;//編號小的先處理
}
}
int main(int argc, char *argv[]) {
int N,K,len;
cin>>N>>K;
vector<key> mykey;
for (int i=0;i<K;i++){
int id,s,c;
cin>>id>>s>>c;
key k;
k.kid=id;
k.time=s;
k.flag=0;//借出
mykey.push_back(k);
k.kid = id;
k.time = s+c;
k.flag=1;//還回
mykey.push_back(k);
}
sort(mykey.begin(),mykey.end(),compare1);
int index[N+1];
for(int i=1;i<=N;i++){//陣列初始化,模擬鑰匙
index[i] = i;
}
for(int i=0;i<mykey.size();i++){
key k = mykey[i];
int id = k.kid,flag = k.flag;
if(flag==0){//借出
for(int j=1;j<=N;j++){//必須從左到右進行遍歷
if(index[j]==id){
index[j]=0;
break;//不能少,找到第一個就結束了
}
}
}
else if(flag==1){//還鑰匙
for(int mj=1;mj<=N;mj++){
if(index[mj]==0){
index[mj]=id;
break;
}
}
}
}
//去掉末尾的空格
cout<<index[1];
for(int i=2;i<=N;i++){
cout<<" "<<index[i];
}
return 0;
}