Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* OUTPUT
- Ben : Fun
- John : Fun
- Tom : Fun
- Chris : Cool
- Josh : Cool
- Alan : Super
- Timmy : Sporty
- Greg : None
- */
- fn main() {
- let S = ["Base", "S", "Bask", "T"];
- let C = ["Cool", "Fun", "Super", "Sporty"];
- let C_s = [vec![0, 1], vec![0], vec![2], vec![2]];
- let K = [
- "Ben", "John", "Tom", "Chris", "Josh", "Alan", "Timmy", "Greg",
- ];
- let K_s = [0, 0, 0, 1, 1, 2, 2, 3];
- // sports to kids
- let mut S_k = vec![vec![]; S.len()];
- (0..K.len()).for_each(|k| S_k[K_s[k]].push(k));
- // sports to camps
- let mut S_c = vec![vec![]; S.len()];
- (0..C.len()).for_each(|c| C_s[c].iter().for_each(|&s| S_c[s].push(c)));
- // Sort by (slots - requests)
- let mut S_slots = vec![0; S.len()];
- (0..C.len())
- .flat_map(|c| C_s[c].iter())
- .for_each(|&s| S_slots[s] += 3);
- K_s.iter().for_each(|&s| S_slots[s] -= 1);
- let mut S_queue = (0..S.len()).collect::<Vec<usize>>();
- S_queue.sort_by_key(|&s| S_slots[s]);
- let mut C_spots = vec![3; C.len()];
- let mut K_c: Vec<Option<usize>> = vec![None; K.len()];
- let mut i = 0;
- while i < S_queue.len() {
- let s = S_queue[i];
- if let Some(k) = S_k[s].pop() {
- // look for camp with most free spots
- match S_c[s]
- .iter()
- .filter(|&&c| C_spots[c] > 0)
- .max_by_key(|&&c| C_spots[c])
- {
- Some(&c) => {
- C_spots[c] -= 1;
- K_c[k] = Some(c);
- }
- None => i += 1, // no camp available
- }
- } else {
- i += 1;
- }
- }
- K_c.iter().enumerate().for_each(|(k, &c)| {
- println!(
- "{:6}: {}",
- K[k],
- match c {
- Some(a) => C[a],
- None => "None",
- }
- );
- });
- }
Add Comment
Please, Sign In to add comment