Guest User

Untitled

a guest
Jul 12th, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.57 KB | None | 0 0
  1. /* OUTPUT
  2. Ben   : Fun
  3. John  : Fun
  4. Tom   : Fun
  5. Chris : Cool
  6. Josh  : Cool
  7. Alan  : Super
  8. Timmy : Sporty
  9. Greg  : None
  10. */
  11.  
  12. fn main() {
  13.     let S = ["Base", "S", "Bask", "T"];
  14.     let C = ["Cool", "Fun", "Super", "Sporty"];
  15.     let C_s = [vec![0, 1], vec![0], vec![2], vec![2]];
  16.     let K = [
  17.         "Ben", "John", "Tom", "Chris", "Josh", "Alan", "Timmy", "Greg",
  18.     ];
  19.     let K_s = [0, 0, 0, 1, 1, 2, 2, 3];
  20.  
  21.     // sports to kids
  22.     let mut S_k = vec![vec![]; S.len()];
  23.     (0..K.len()).for_each(|k| S_k[K_s[k]].push(k));
  24.  
  25.     // sports to camps
  26.     let mut S_c = vec![vec![]; S.len()];
  27.     (0..C.len()).for_each(|c| C_s[c].iter().for_each(|&s| S_c[s].push(c)));
  28.  
  29.     // Sort by (slots - requests)
  30.     let mut S_slots = vec![0; S.len()];
  31.     (0..C.len())
  32.         .flat_map(|c| C_s[c].iter())
  33.         .for_each(|&s| S_slots[s] += 3);
  34.     K_s.iter().for_each(|&s| S_slots[s] -= 1);
  35.     let mut S_queue = (0..S.len()).collect::<Vec<usize>>();
  36.     S_queue.sort_by_key(|&s| S_slots[s]);
  37.  
  38.     let mut C_spots = vec![3; C.len()];
  39.     let mut K_c: Vec<Option<usize>> = vec![None; K.len()];
  40.     let mut i = 0;
  41.     while i < S_queue.len() {
  42.         let s = S_queue[i];
  43.         if let Some(k) = S_k[s].pop() {
  44.             // look for camp with most free spots
  45.             match S_c[s]
  46.                 .iter()
  47.                 .filter(|&&c| C_spots[c] > 0)
  48.                 .max_by_key(|&&c| C_spots[c])
  49.             {
  50.                 Some(&c) => {
  51.                     C_spots[c] -= 1;
  52.                     K_c[k] = Some(c);
  53.                 }
  54.                 None => i += 1, // no camp available
  55.             }
  56.         } else {
  57.             i += 1;
  58.         }
  59.     }
  60.     K_c.iter().enumerate().for_each(|(k, &c)| {
  61.         println!(
  62.             "{:6}: {}",
  63.             K[k],
  64.             match c {
  65.                 Some(a) => C[a],
  66.                 None => "None",
  67.             }
  68.         );
  69.     });
  70. }
Add Comment
Please, Sign In to add comment