Bring a post to the top of the query if it’s in a certain category?

You will have to use 2 queries, where in the first loop you should use:

$args = array(  
  "post_type" => "post",
  "post_status" => "publish",
  "orderby" => "date",
  "order" => "DESC",
  "posts_per_page" => 20,
  'post__in' => cat,
);
(The Query)

And in the second:

$args = array(  
  "post_type" => "post",
  "post_status" => "publish",
  "orderby" => "date",
  "order" => "DESC",
  "posts_per_page" => 20,
  'post__not_in' => cat,
);
(The Query)

This should work because the first loop will take only the posts from cat and the second loop all others, and the first loop will always stay on top, Altought I don’t know if you won’t have a problem with the paginations that way, you should also ensure that you reset the post data with wp_reset_query(); for example.