It depends on the output type of the UTXOs you are spending.
If they start with
1…, they are Pay to Public Key Hash (P2PKH) aka legacy outputs and spending them their inputs weight 148 vB
3…, they are probably Pay to Script Hash-wrapped Pay to Witness Public Key Hash (P2SH-P2WPKH) aka wrapped segwit outputs and spending them weighs 91 vB for each (since you said they're single-sig)
bc1q… they are Pay to Witness Public Key Hash (P2WPKH, native segwit v0) and their input weight is 68 vB
bc1p… they are Pay to Taproot (P2TR, native segwit v1) outputs and weigh 57.5 vB to spend
So, if e.g. your UTXOs were P2PKH 5 × 148 vB × 100 s/vB = 74 000 sats, if they’re P2WPKH it’s 5 × 68 vB × 100 s/vB = 34 000 sats.
To that you’ll still need to add the weight of the recipient output, change output, and transaction header. Outputs are also different weight depending on type, ranging 31–43 vB. The header should be either 10 vB or 10.5 vB depending on whether your inputs are segwit or not.
1…
, they are Pay to Public Key Hash (P2PKH) aka legacy outputs and spending them their inputs weight 148 vB3…
, they are probably Pay to Script Hash-wrapped Pay to Witness Public Key Hash (P2SH-P2WPKH) aka wrapped segwit outputs and spending them weighs 91 vB for each (since you said they're single-sig)bc1q…
they are Pay to Witness Public Key Hash (P2WPKH, native segwit v0) and their input weight is 68 vBbc1p…
they are Pay to Taproot (P2TR, native segwit v1) outputs and weigh 57.5 vB to spend