## Problem Description and Formulation

The hotel's goal is to minimize the weekly wage bill while meeting certain staffing requirements. Let's denote the number of cleaners as \(C\) and the number of receptionists as \(R\).

### Objective Function

The objective is to minimize the total weekly wage bill. Cleaners earn $500 per week, and receptionists earn $350 per week. Therefore, the objective function can be written as:

\[ \text{Minimize:} \quad 500C + 350R \]

### Constraints

1. **Minimum Total Workers**: The hotel requires a minimum of 100 workers.
\[ C + R \geq 100 \]

2. **Minimum Receptionists**: At least 20 workers must be receptionists.
\[ R \geq 20 \]

3. **Receptionists to Cleaners Ratio**: The number of receptionists should be at least a third of the number of cleaners.
\[ R \geq \frac{1}{3}C \]

4. **Weekly Wage Bill**: The hotel wants to keep the weekly wage bill below $30,000.
\[ 500C + 350R \leq 30000 \]

5. **Non-Negativity**: The number of cleaners and receptionists cannot be negative.
\[ C \geq 0, R \geq 0 \]

However, given that we have a minimum requirement for both \(C\) and \(R\), and considering the context, we focus on the constraints provided.

## Gurobi Code

To solve this linear programming problem using Gurobi in Python, we can use the following code:

```python
import gurobi

def hotel_staffing_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    C = model.addVar(lb=0, name="Cleaners", vtype=gurobi.GRB.INTEGER)
    R = model.addVar(lb=0, name="Receptionists", vtype=gurobi.GRB.INTEGER)

    # Objective function: Minimize the wage bill
    model.setObjective(500*C + 350*R, gurobi.GRB.MINIMIZE)

    # Constraints
    model.addConstr(C + R >= 100, name="Min_Total_Workers")
    model.addConstr(R >= 20, name="Min_Receptionists")
    model.addConstr(R >= C/3, name="Receptionists_to_Cleaners_Ratio")
    model.addConstr(500*C + 350*R <= 30000, name="Max_Wage_Bill")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Cleaners: {C.varValue}")
        print(f"Receptionists: {R.varValue}")
        print(f"Minimum Wage Bill: ${model.objVal:.2f}")
    else:
        print("No optimal solution found.")

if __name__ == "__main__":
    hotel_staffing_problem()
```

This code sets up the linear programming problem as described, using Gurobi's Python interface to define the variables, objective function, and constraints. It then solves the problem and prints out the optimal solution if one is found.