結果
問題 | No.90 品物の並び替え |
ユーザー |
![]() |
提出日時 | 2021-04-01 15:02:52 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 348 ms / 5,000 ms |
コード長 | 4,036 bytes |
コンパイル時間 | 12,906 ms |
コンパイル使用メモリ | 404,992 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-12-17 19:05:20 |
合計ジャッジ時間 | 13,489 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 9 |
ソースコード
#[allow(unused_macros)]macro_rules! read {([$t:ty] ; $n:expr) =>((0..$n).map(|_| read!([$t])).collect::<Vec<_>>());($($t:ty),+ ; $n:expr) =>((0..$n).map(|_| read!($($t),+)).collect::<Vec<_>>());([$t:ty]) =>(rl().split_whitespace().map(|w| w.parse().unwrap()).collect::<Vec<$t>>());($t:ty) =>(rl().parse::<$t>().unwrap());($($t:ty),*) => {{let buf = rl();let mut w = buf.split_whitespace();($(w.next().unwrap().parse::<$t>().unwrap()),*)}};}#[allow(dead_code)]fn rl() -> String {let mut buf = String::new();std::io::stdin().read_line(&mut buf).unwrap();buf.trim_end().to_owned()}fn main() {let (n, m) = read!(usize, usize);let table = read!([usize]; m);let mut max_score = 0;// let mut best_order: Vec<usize> = (0..n).collect();let mut order: Vec<usize> = (0..n).collect();loop {let mut score = 0;// calc point.for data in &table {let (item1, item2, s) = (data[0], data[1], data[2]);// find index of item1let mut i1 = 0;for i in 0..n {if order[i] == item1 {i1 = i;break;}}for i in i1+1..n {if order[i] == item2 {score += s;break;}}}// update best orderif score >= max_score {// best_order = order.clone();max_score = score;}// update orderif !order.next_permutation() {break;}}// println!("{:?}", best_order);println!("{}", max_score);}pub trait LexicalPermutation {/// Return `true` if the slice was permuted, `false` if it is already/// at the last ordered permutation.fn next_permutation(&mut self) -> bool;/// Return `true` if the slice was permuted, `false` if it is already/// at the first ordered permutation.fn prev_permutation(&mut self) -> bool;}impl<T> LexicalPermutation for [T] where T: Ord {/// Original author in Rust: Thomas Backman <serenity@exscape.org>fn next_permutation(&mut self) -> bool {// These cases only have 1 permutation each, so we can't do anything.if self.len() < 2 { return false; }// Step 1: Identify the longest, rightmost weakly decreasing part of the vectorlet mut i = self.len() - 1;while i > 0 && self[i-1] >= self[i] {i -= 1;}// If that is the entire vector, this is the last-ordered permutation.if i == 0 {return false;}// Step 2: Find the rightmost element larger than the pivot (i-1)let mut j = self.len() - 1;while j >= i && self[j] <= self[i-1] {j -= 1;}// Step 3: Swap that element with the pivotself.swap(j, i-1);// Step 4: Reverse the (previously) weakly decreasing partself[i..].reverse();true}fn prev_permutation(&mut self) -> bool {// These cases only have 1 permutation each, so we can't do anything.if self.len() < 2 { return false; }// Step 1: Identify the longest, rightmost weakly increasing part of the vectorlet mut i = self.len() - 1;while i > 0 && self[i-1] <= self[i] {i -= 1;}// If that is the entire vector, this is the first-ordered permutation.if i == 0 {return false;}// Step 2: Reverse the weakly increasing partself[i..].reverse();// Step 3: Find the rightmost element equal to or bigger than the pivot (i-1)let mut j = self.len() - 1;while j >= i && self[j-1] < self[i-1] {j -= 1;}// Step 4: Swap that element with the pivotself.swap(i-1, j);true}}