1. 程式人生 > >ccf公共鑰匙盒

ccf公共鑰匙盒

題目描述見圖片,如下
這裡寫圖片描述
題目輸入,見圖片
這裡寫圖片描述
題目分析
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; }