To solve this problem, we first need to define the decision variables and the objective function. Let's denote the number of cleaners as \(C\) and the number of receptionists as \(R\). The objective is to minimize the total weekly wage bill.

The weekly wage bill can be calculated as \(500C + 350R\), since each cleaner earns $500 per week and each receptionist earns $350 per week.

We have several constraints:
1. The hotel requires a minimum of 100 workers: \(C + R \geq 100\).
2. At least 20 must be receptionists: \(R \geq 20\).
3. The number of receptionists should be at least a third of the number of cleaners: \(R \geq \frac{1}{3}C\).
4. The hotel wants to keep the weekly wage bill below $30,000: \(500C + 350R \leq 30000\).

To formulate this as a linear programming (LP) problem, we want to minimize the total wage bill subject to these constraints.

Now, let's translate this into Gurobi code in Python:

```python
from gurobipy import *

# Create a model
m = Model("Hotel_Staffing")

# Define the decision variables
C = m.addVar(vtype=GRB.INTEGER, name="cleaners")
R = m.addVar(vtype=GRB.INTEGER, name="receptionists")

# Set the objective function to minimize the wage bill
m.setObjective(500*C + 350*R, GRB.MINIMIZE)

# Add constraints
m.addConstr(C + R >= 100, "total_workers")
m.addConstr(R >= 20, "min_receptionists")
m.addConstr(R >= (1/3)*C, "receptionist_to_cleaner_ratio")
m.addConstr(500*C + 350*R <= 30000, "max_wage_bill")

# Optimize the model
m.optimize()

# Print out the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of cleaners: {C.x}")
    print(f"Number of receptionists: {R.x}")
    print(f"Total wage bill: ${500*C.x + 350*R.x}")
else:
    print("No optimal solution found")
```