Advertisement
paranid5

Голосование (Rust version)

Jun 30th, 2020
373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.28 KB | None | 0 0
  1. use std::collections::BTreeMap;
  2. use std::io;
  3. use std::str::SplitWhitespace;
  4.  
  5. fn main() {
  6.     let mut n: String = String::new();
  7.     io::stdin().read_line(&mut n).unwrap();
  8.     let n: i128 = n.trim().parse().unwrap();
  9.     let mut amount: BTreeMap<String, i128> = BTreeMap::new(); // кол-во голосующих от штатов
  10.     for _i in 0..n {
  11.         let mut input: String = String::new();
  12.         io::stdin().read_line(&mut input).unwrap();
  13.         let mut it_input: SplitWhitespace = input.split_whitespace();
  14.         let state: String = it_input.next().unwrap().to_string();
  15.         let voices: i128 = it_input.next().unwrap().parse().unwrap();
  16.         amount.insert(state, voices);
  17.     } // заполнили колвом голосов
  18.     let mut m: String = String::new();
  19.     io::stdin().read_line(&mut m).unwrap();
  20.     let m: i128 = m.trim().parse().unwrap();
  21.     let mut voice: BTreeMap<String, BTreeMap<String, i128>> = BTreeMap::new(); // голосование в штате
  22.     let mut victory: BTreeMap<String, i128> = BTreeMap::new();
  23.     for _i in 0..m {
  24.         let mut input: String = String::new();
  25.         io::stdin().read_line(&mut input).unwrap();
  26.         let mut it_input: SplitWhitespace = input.split_whitespace();
  27.         let state: String = it_input.next().unwrap().to_string();
  28.         let guy: String = it_input.next().unwrap().to_string();
  29.         if !victory.contains_key(&guy) {
  30.             victory.insert(guy.clone(), 0);
  31.         }
  32.         if !voice.contains_key(&state) {
  33.             let mut ins: BTreeMap<String, i128> = BTreeMap::new();
  34.             ins.insert(guy, 1);
  35.             voice.insert(state, ins);
  36.         } else {
  37.             if !voice[&state].contains_key(&guy) {
  38.                 voice.get_mut(&state).unwrap().insert(guy, 1);
  39.             } else {
  40.                 *voice.get_mut(&state).unwrap().get_mut(&guy).unwrap() += 1;
  41.             }
  42.         }
  43.     } // голосование в каждом штате
  44.     let mut guys: BTreeMap<String, String> = BTreeMap::new();
  45.     // победитель в штате (штат, имя)
  46.     for it in voice.iter() {
  47.         let mut max: (String, i128) = ("".to_string(), -1);
  48.         for its in it.1.iter() {
  49.             if its.1 > &max.1 {
  50.                 max.0 = its.0.to_string();
  51.                 max.1 = *its.1;
  52.             }
  53.         }
  54.         guys.insert(it.0.to_string(), max.0);
  55.     }
  56.     for guy in guys.iter() {
  57.         *victory.get_mut(guy.1).unwrap() += *amount.get_mut(guy.0).unwrap();
  58.     }
  59.     let mut print: Vec<(String, i128)> = Vec::with_capacity(victory.len());
  60.     print.resize(victory.len(), ("".to_string(), 0));
  61.     // сортировка по значению
  62.     let mut ind: usize = 0;
  63.     for it in victory {
  64.         print[ind] = it;
  65.         ind += 1;
  66.     }
  67.     print.sort();
  68.     let mut start: usize = 0;
  69.     let mut finish: usize = 0;
  70.     for mut i in 0..print.len() - 1 {
  71.         if print[i].1 != print[i + 1].1 {
  72.             start += 1;
  73.             finish += 1;
  74.         } else {
  75.             while i < print.len() - 1 && print[i].1 == print[i + 1].1 {
  76.                 finish += 1;
  77.                 i += 1;
  78.             }
  79.             &mut print[start..finish].reverse();
  80.             finish += 1;
  81.             start = finish;
  82.         }
  83.     } // сортировка имён
  84.     for i in print {
  85.         println!("{} {}", i.0, i.1);
  86.     }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement