Advertisement
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)));
- let mut order = (0..S.len()).collect::<Vec<usize>>();
- order.sort_by_key(|&s| S_k[s].len());
- 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.len() {
- let s = order[i];
- if let Some(k) = S_k[s].pop() {
- // Look for the camps with most spots available
- 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,
- }
- } else {
- i += 1;
- }
- }
- K_c.iter().enumerate().for_each(|(k, &c)| {
- println!("{:6}: {}", K[k], match c {
- Some(a) => C[a],
- None => "None"
- });
- });
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement