# rooms: number of rooms availible for surger
# par: number of patients for the day

surgery = function(rooms,pat){
  rnum = rep(0,rooms) #room number
    recovtime = rep(3,pat)
    
    mat = matrix(0,nrow=pat,ncol=6)
    colnames(mat,do.NULL=FALSE)
    colnames(mat) = c("Pat. #","Random #",'Op. Length',"Start Time","End Time",'Op. Room')
    mat[,1] = seq(1,pat)    #Patient Number
    mat[,2] = sample(0:999,pat,replace=T)   #Patient random number
    mat[,4] = rep(7.5,pat)
    mat[1:rooms,6] = seq(1,rooms)   #Initial Room numbers
        

    for (i in 1:pat){       #Calculate the patient surgery times and recovery times
        
        if (mat[i,2]<=384){
            mat[i,3]=0.5
            recovtime[i]=0}
        if (mat[i,2]>384 && mat[i,2]<=620){
            mat[i,3]=1} 
        if (mat[i,2]>620 && mat[i,2]<=766){
            mat[i,3]=1.5}
        if (mat[i,2]>766 && mat[i,2]<=856){
            mat[i,3]=2.0}
        if (mat[i,2]>856 && mat[i,2]<=911){
            mat[i,3]=2.5}   
        if (mat[i,2]>911 && mat[i,2]<=945){
            mat[i,3]=3.0}   
        if (mat[i,2]>945 && mat[i,2]<=966){
            mat[i,3]=3.5}   
        if (mat[i,2]>966 && mat[i,2]<=979){
            mat[i,3]=4.0}
        if (mat[i,2]>980 && mat[i,2]<=999){
            mat[i,3]=5}     
        }
    
    mat[1:rooms,5] = mat[1:rooms,4]+mat[1:rooms,3] #1st round end times
    rnum = mat[1:rooms,3]   #inital time after 1st round of surgeries
    
    #Find next availible room
    # which.min finds the 
    for (j in (rooms+1):pat){
    ravail = which.min(rnum)
    mat[j,6] = ravail   #Operating Room #
    mat[j,4] = mat[j,4]+rnum[ravail]+0.25   #Start Time
    mat[j,5] = mat[j,4]+mat[j,3]    #End Time

    rnum[ravail] = rnum[ravail]+mat[j,3]+0.25
    }
    
    return(mat)
}
surgery (4,32)
##       Pat. # Random # Op. Length Start Time End Time Op. Room
##  [1,]      1       39        0.5       7.50     8.00        1
##  [2,]      2      242        0.5       7.50     8.00        2
##  [3,]      3       37        0.5       7.50     8.00        3
##  [4,]      4      630        1.5       7.50     9.00        4
##  [5,]      5      291        0.5       8.25     8.75        1
##  [6,]      6      138        0.5       8.25     8.75        2
##  [7,]      7      843        2.0       8.25    10.25        3
##  [8,]      8      285        0.5       9.00     9.50        1
##  [9,]      9      221        0.5       9.00     9.50        2
## [10,]     10      308        0.5       9.25     9.75        4
## [11,]     11      289        0.5       9.75    10.25        1
## [12,]     12      866        2.5       9.75    12.25        2
## [13,]     13      805        2.0      10.00    12.00        4
## [14,]     14      217        0.5      10.50    11.00        1
## [15,]     15      515        1.0      10.50    11.50        3
## [16,]     16      514        1.0      11.25    12.25        1
## [17,]     17      381        0.5      11.75    12.25        3
## [18,]     18      119        0.5      12.25    12.75        4
## [19,]     19      333        0.5      12.50    13.00        1
## [20,]     20      597        1.0      12.50    13.50        2
## [21,]     21      522        1.0      12.50    13.50        3
## [22,]     22      854        2.0      13.00    15.00        4
## [23,]     23      213        0.5      13.25    13.75        1
## [24,]     24      940        3.0      13.75    16.75        2
## [25,]     25      837        2.0      13.75    15.75        3
## [26,]     26      124        0.5      14.00    14.50        1
## [27,]     27      816        2.0      14.75    16.75        1
## [28,]     28       70        0.5      15.25    15.75        4
## [29,]     29      379        0.5      16.00    16.50        3
## [30,]     30      790        2.0      16.00    18.00        4
## [31,]     31      562        1.0      16.75    17.75        3
## [32,]     32       57        0.5      17.00    17.50        1