fn main() { input! { n: Chars, } let sz = n.len(); let mut ret = vec![0; sz]; let mut f = false; // 確定フラグ for i in 0..sz { if f { ret[i] = 5; continue; } let val = n[i] as usize - 0x30; if val >= 6 { f = true; ret[i] = 5; } else if val == 4 || val == 5 { ret[i] = val; } else { // 後ろに戻って5を見つける let mut prev_5 = i; loop { // 5を見つけた if ret[prev_5] == 5 { ret[prev_5] = 4; for j in prev_5+1..=i { ret[j] = 5; } f = true; break; } // 5が見つからない if prev_5 == 0 { // all5 ret.pop(); for _ in 0..ret.len() { print!("5"); } println!(); return; } prev_5 -= 1; } } } for k in 0..ret.len() { print!("{}", ret[k]); } println!(); } // [6-9]***** -> 555555 (確定) // [4,5]***** -> [4,5]***** (続きを見る) // X[0-3]**** -> 5555 // 4[0-3]**** -> 5555 --> 5の位置に戻って4にする、すべて5、見つからないすべて5で-1桁 // 5[0-3]**** -> 45555 // 55454444000 // 55445555555 // 55454454245 // 5554[0-3]*** // 55455555 // const MOD93: usize = 998244353; // const MOD17: usize = 1000000007; // const INV2: usize = 499122177; // MOD93の剰余世界では、1/2の代わりにこれを掛ける // const INF: usize = 1 << 60; // const D: [(usize, usize); 4] = [(!0, 0), (0, !0), (1, 0), (0, 1)]; // 上左下右 // fn us(x: i32) -> usize { x as usize } // 文字の定義 // const CHAR_SZ: usize = 26; // const UPPER_A_ASCII : usize = 0x41; // const UPPER_Z_ASCII : usize = UPPER_A_ASCII + SZ - 1; // const LOWER_A_ASCII : usize = 0x61; // const LOWER_Z_ASCII : usize = LOWER_A_ASCII + SZ - 1; #[allow(unused)] #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone)] struct Pos { x: usize, y: usize, } #[allow(unused)] enum Direction { UP = 0, LEFT = 1, DOWN = 2, RIGHT = 3, } #[allow(unused)] #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone)] struct LoopCount { ans: usize, // 答え step: usize, // 残りステップ pos: usize, // 現在位置 cycle_len: usize, // サイクル数 cycle_add: usize, // サイクルによる増加 } #[allow(unused)] use proconio::{input, marker::Chars, marker::Usize1}; // use proconio::{input, input_interactive, marker::Chars, marker::Usize1}; #[allow(unused)] use std::{ println, print, mem::swap, cmp::min, cmp::max, cmp::Reverse, collections::HashSet, collections::BTreeSet, collections::HashMap, collections::BTreeMap, collections::BinaryHeap, collections::VecDeque, iter::FromIterator, }; #[allow(unused)] use itertools::Itertools; // #[allow(unused)] // use num::{integer::gcd, Signed}; // #[allow(unused)] // use num_integer::Roots;// 通常の平方根 // #[allow(unused)] // use superslice::Ext; // #[allow(unused)] // use rand::Rng; // let mut rng = rand::thread_rng(); // let n = rng.gen_range(1, 1000); // 連想配列のデバッグ #[allow(unused)] fn dbg_print_mp(mp: &HashMap) { for (&k, &v) in mp { println!("key:{} val:{}", k, v); } } // グリッドのデバッグ #[allow(unused)] fn dbg_print_grid(h: usize, w: usize, grid: &Vec>) { for i in 0..h { for j in 0..w { print!("{}", grid[i][j]); } println!(); } } // 最短距離のデバッグ #[allow(unused)] fn dbg_print_dist(h: usize, w: usize, dist: &Vec>) { let limit = 255; for i in 0..h { for j in 0..w { print!("{:03} ", min(dist[i][j], limit)); } println!(); } }