## Problem Description and Formulation

The problem is a linear programming optimization problem. The goal is to maximize profit by determining the number of heated and regular seats to sell in a hockey arena, given certain constraints.

### Decision Variables

- \(H\): The number of heated seats to sell.
- \(R\): The number of regular seats to sell.

### Objective Function

The profit made on each heated seat is $30, and on each regular seat is $20. The objective is to maximize the total profit \(P\), which can be represented as:
\[P = 30H + 20R\]

### Constraints

1. **Arena Capacity**: The arena can hold at most 300 people.
\[H + R \leq 300\]

2. **Minimum Heated Seats**: The arena reserves a minimum of 50 seats to be heated seats.
\[H \geq 50\]

3. **Preference for Regular Seats**: At least 3 times as many people prefer to sit in regular seats.
\[R \geq 3H\]

4. **Non-Negativity**: The number of seats cannot be negative.
\[H \geq 0, R \geq 0\]

However, given that \(H \geq 50\), the \(H \geq 0\) and \(R \geq 0\) constraints are implicitly satisfied.

## Gurobi Code

```python
import gurobipy as gp

# Create a new model
m = gp.Model("Hockey_Arena_Seating")

# Decision Variables
H = m.addVar(name="Heated_Seats", lb=50)  # At least 50 heated seats
R = m.addVar(name="Regular_Seats")  # No lower bound specified, but will be constrained

# Objective Function: Maximize profit
m.setObjective(30*H + 20*R, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(H + R <= 300, name="Arena_Capacity")  # Total seats do not exceed 300
m.addConstr(R >= 3*H, name="Preference_Regular")  # Regular seats are at least 3 times heated seats

# Solve the model
m.solve()

# Output
if m.status == gp.GRB.OPTIMAL:
    print(f"Optimal Solution: Heated Seats = {H.varValue}, Regular Seats = {R.varValue}")
    print(f"Maximum Profit: ${30*H.varValue + 20*R.varValue}")
else:
    print("No optimal solution found.")
```