代码如下:
#include <iostream> #include <algorithm>//sort()函数头文件 using namespace std; #define N 1002 typedef struct Key{ int name;//钥匙序号 int begin;//开始时间 int time;//持续时间 int flag=0;//flag=1:此借出、归还操作已执行 }Key; bool BeginCmp(Key first,Key second){//按起始时间从小到大排序 return first.begin<second.begin; } bool EndCmp(Key first,Key second){ if(first.begin+first.time==second.begin+second.time) { return first.name<second.name;}//同一时间还,序号小的钥匙先还入 else return first.begin+first.time<second.begin+second.time; } int main(){ int n,k;//n把钥匙,k位老师操作 cin>>n>>k; int Num[N]; for(int i=0;i<n;i++){//初始化钥匙存放序号Num()数组 Num[i]=i+1; } Key key[k]; for(int i=0;i<k;i++){//输入老师的操作信息 cin>>key[i].name>>key[i].begin>>key[i].time; } sort(key,key+k,BeginCmp); int BeginTimeFlag=key[0].begin;//最早开始时间 sort(key,key+k,EndCmp); int EndTimeFlag=key[k-1].begin+key[k-1].time;//最晚结束时间 //cout<<BeginTimeFlag<<" "<<EndTimeFlag<<endl; for(int i=BeginTimeFlag;i<=EndTimeFlag;i++){//对时间遍历 for(int j=0;j<k;j++){//对操作遍历 if(key[j].flag==0){//key[j].flag==0,说明k[j]的借出、归还操作未全执行一次 if(key[j].begin+key[j].time==i){ //到达钥匙j的归还还时间 for(int x=0;x<n;x++){//将钥匙j存入最小的空钥匙挂钩上 if(Num[x]==0){ Num[x]=key[j].name;//放入钥匙 key[j].flag=1;//key[j]的借出、归还操作已执行完毕,key[j].flag赋值为1,后续不需执行 break; } } } else if(key[j].begin==i){//到达钥匙j的借出时间 for(int x=0;x<n;x++){ if(Num[x]==key[j].name){ Num[x]=0;//借出钥匙,钥匙盒中此位置为0 break;//后续循环内容不需执行 } } } } } } for(int i=0;i<n;i++){ cout<<Num[i]<<" "; } return 0; }
题目如下:
编辑