第一次写博客 好紧张- -
本题的意思就是说:
有N个同学要进宿舍,如果宿舍门是关着的就要刷卡进入,一个同学刷卡后L秒之内其他同学进入不用再刷卡,问全部同学进入后有多少个同学刷了卡
代码如下:
#include<stdio.h>
typedef struct timer{
int time;
int i;
}Nove;
int partition(Nove arr[],int low ,int high){ //快排函数
Nove key;
key=arr[low];
while(low<high){
while(low<high&&arr[high].time>=key.time)
high--;
if(low<high)
arr[low++]=arr[high];
while(low<high&&arr[low].time<=key.time)
low++;
if(low<high)
arr[high--]=arr[low];
}
arr[low]=key;
return low;
}
void sort(Nove arr[],int start,int end){ //快排函数
int pos;
if(start<end){
pos=partition(arr,start,end);
sort(arr,start,pos-1);
sort(arr,pos+1,end);
}
}
int main(){
int T,i,a,b,c,N,L,j;
int time,sum,pr[20000];
Nove arr[20000];
scanf("%d",&T);
while(T--){
time=0;
sum=0;
scanf("%d %d",&N,&L);
for(i=0;i<N;i++){
scanf("%d:%d:%d",&a,&b,&c);
arr[i].time=a*60*60+b*60+c;
arr[i].i=i+1;
}
sort(arr,0,N-1); //本来用的冒泡排序但是超时,改成快排就过了
int p=0;
for(i=0;i<N;i++){
if(arr[i].time>=time){ //time之后的同学进入刷卡
sum++; //sum为总共刷卡的次数
pr[p]=arr[i].i; //pr[]记录了刷了卡的同学的编号
p++;
time=arr[i].time+L;
}
}
printf("%d\n",sum);
for(i=0;i<sum;i++){
for(j=i;j<sum;j++){
if(pr[i]>pr[j]){
int flag=pr[i];
pr[i]=pr[j];
pr[j]=flag;
}
}
}
for(i=0;i<sum;i++){
printf("%d",pr[i]);
if(i!=sum-1)
printf(" "); //注意格式 被坑惨。。。。。
}
printf("\n");
}
return 0 ;
}