結果

問題 No.1630 Sorting Integers (Greater than K)
ユーザー akiradeveloperakiradeveloper
提出日時 2021-07-30 22:49:08
言語 Rust
(1.77.0 + proconio)
結果
WA  
実行時間 -
コード長 7,527 bytes
コンパイル時間 13,607 ms
コンパイル使用メモリ 378,316 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-09-16 02:21:43
合計ジャッジ時間 14,993 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,248 KB
testcase_02 AC 1 ms
5,376 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 1 ms
5,376 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
testcase_18 RE -
testcase_19 RE -
testcase_20 RE -
testcase_21 RE -
testcase_22 RE -
testcase_23 RE -
testcase_24 RE -
testcase_25 RE -
testcase_26 RE -
権限があれば一括ダウンロードができます
コンパイルメッセージ
warning: unused variable: `out`
   --> src/main.rs:113:13
    |
113 |     let mut out = BufWriter::new(out.lock());
    |             ^^^ help: if this is intentional, prefix it with an underscore: `_out`
    |
    = note: `#[warn(unused_variables)]` on by default

warning: variable does not need to be mutable
   --> src/main.rs:113:9
    |
113 |     let mut out = BufWriter::new(out.lock());
    |         ----^^^
    |         |
    |         help: remove this `mut`
    |
    = note: `#[warn(unused_mut)]` on by default

warning: variable `G` should have a snake case name
   --> src/main.rs:119:10
    |
119 |     let mut G = into_digits(10, k);
    |             ^ help: convert the identifier to snake case: `g`
    |
    = note: `#[warn(non_snake_case)]` on by default

warning: variable `M` should have a snake case name
   --> src/main.rs:122:10
    |
122 |     let mut M = vec![];
    |             ^ help: convert the identifier to snake case: `m`

warning: variable `M2` should have a snake case name
   --> src/main.rs:177:11
    |
177 |         let mut M2 = vec![];
    |                 ^^ help: convert the identifier to snake case: `m2`

ソースコード

diff #

#[doc = " https://github.com/akiradeveloper/rust-comp-snippets"]
#[allow(unused_imports)]
use std::cmp::{max, min, Ordering};
#[allow(unused_imports)]
use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, VecDeque};
#[allow(unused_imports)]
use std::iter::FromIterator;
#[macro_export]
macro_rules ! chmax { ( $ x : expr , $ ( $ v : expr ) ,+ ) => { $ ( $ x = std :: cmp :: max ( $ x ,$ v ) ; ) + } ; }
#[macro_export]
macro_rules ! chmin { ( $ x : expr , $ ( $ v : expr ) ,+ ) => { $ ( $ x = std :: cmp :: min ( $ x ,$ v ) ; ) + } ; }
#[macro_export]
macro_rules ! max { ( $ x : expr ) => ( $ x ) ; ( $ x : expr , $ ( $ xs : expr ) ,+ ) => { std :: cmp :: max ( $ x , max ! ( $ ( $ xs ) ,+ ) ) } ; }
#[macro_export]
macro_rules ! min { ( $ x : expr ) => ( $ x ) ; ( $ x : expr , $ ( $ xs : expr ) ,+ ) => { std :: cmp :: min ( $ x , min ! ( $ ( $ xs ) ,+ ) ) } ; }
#[macro_export]
macro_rules ! dvec { ( $ t : expr ; $ len : expr ) => { vec ! [ $ t ; $ len ] } ; ( $ t : expr ; $ len : expr , $ ( $ rest : expr ) ,* ) => { vec ! [ dvec ! ( $ t ; $ ( $ rest ) ,* ) ; $ len ] } ; }
#[macro_export]
macro_rules ! cfor { ( ; $ ( $ rest : tt ) * ) => { cfor ! ( ( ) ; $ ( $ rest ) * ) } ; ( $ ( $ init : stmt ) ,+; ; $ ( $ rest : tt ) * ) => { cfor ! ( $ ( $ init ) ,+; ! false ; $ ( $ rest ) * ) } ; ( $ ( $ init : stmt ) ,+; $ cond : expr ; ; $ body : block ) => { cfor ! { $ ( $ init ) ,+; $ cond ; ( ) ; $ body } } ; ( $ ( $ init : stmt ) ,+; $ cond : expr ; $ ( $ step : expr ) ,+; $ body : block ) => { { $ ( $ init ; ) + while $ cond { let mut _first = true ; let mut _continue = false ; loop { if ! _first { _continue = true ; break } _first = false ; $ body } if ! _continue { break } $ ( $ step ; ) + } } } ; }
#[doc = " main"]
#[allow(unused_imports)]
use std::io::{stdin, stdout, BufWriter, Write};
#[macro_export]
macro_rules ! input { ( source = $ s : expr , $ ( $ r : tt ) * ) => { let mut parser = Parser :: from_str ( $ s ) ; input_inner ! { parser , $ ( $ r ) * } } ; ( parser = $ parser : ident , $ ( $ r : tt ) * ) => { input_inner ! { $ parser , $ ( $ r ) * } } ; ( new_stdin_parser = $ parser : ident , $ ( $ r : tt ) * ) => { let stdin = std :: io :: stdin ( ) ; let reader = std :: io :: BufReader :: new ( stdin . lock ( ) ) ; let mut $ parser = Parser :: new ( reader ) ; input_inner ! { $ parser , $ ( $ r ) * } } ; ( $ ( $ r : tt ) * ) => { input ! { new_stdin_parser = parser , $ ( $ r ) * } } ; }
#[macro_export]
macro_rules ! input_inner { ( $ parser : ident ) => { } ; ( $ parser : ident , ) => { } ; ( $ parser : ident , $ var : ident : $ t : tt $ ( $ r : tt ) * ) => { let $ var = read_value ! ( $ parser , $ t ) ; input_inner ! { $ parser $ ( $ r ) * } } ; }
#[macro_export]
macro_rules ! read_value { ( $ parser : ident , ( $ ( $ t : tt ) ,* ) ) => { ( $ ( read_value ! ( $ parser , $ t ) ) ,* ) } ; ( $ parser : ident , [ $ t : tt ; $ len : expr ] ) => { ( 0 ..$ len ) . map ( | _ | read_value ! ( $ parser , $ t ) ) . collect ::< Vec < _ >> ( ) } ; ( $ parser : ident , chars ) => { read_value ! ( $ parser , String ) . chars ( ) . collect ::< Vec < char >> ( ) } ; ( $ parser : ident , usize1 ) => { read_value ! ( $ parser , usize ) - 1 } ; ( $ parser : ident , $ t : ty ) => { $ parser . next ::<$ t > ( ) . expect ( "Parse error" ) } ; }
use std::io;
use std::io::BufRead;
use std::str;
pub struct Parser<R> {
    reader: R,
    buf: Vec<u8>,
    pos: usize,
}
impl Parser<io::Empty> {
    pub fn from_str(s: &str) -> Parser<io::Empty> {
	Parser {
	    reader: io::empty(),
	    buf: s.as_bytes().to_vec(),
	    pos: 0,
	}
    }
}
impl<R: BufRead> Parser<R> {
    pub fn new(reader: R) -> Parser<R> {
	Parser {
	    reader: reader,
	    buf: vec![],
	    pos: 0,
	}
    }
    pub fn update_buf(&mut self) {
	self.buf.clear();
	self.pos = 0;
	loop {
	    let (len, complete) = {
		let buf2 = self.reader.fill_buf().unwrap();
		self.buf.extend_from_slice(buf2);
		let len = buf2.len();
		if len == 0 {
		    break;
		}
		(len, buf2[len - 1] <= 0x20)
	    };
	    self.reader.consume(len);
	    if complete {
		break;
	    }
	}
    }
    pub fn next<T: str::FromStr>(&mut self) -> Result<T, T::Err> {
	loop {
	    let mut begin = self.pos;
	    while begin < self.buf.len() && (self.buf[begin] <= 0x20) {
		begin += 1;
	    }
	    let mut end = begin;
	    while end < self.buf.len() && (self.buf[end] > 0x20) {
		end += 1;
	    }
	    if begin != self.buf.len() {
		self.pos = end;
		return str::from_utf8(&self.buf[begin..end]).unwrap().parse::<T>();
	    } else {
		self.update_buf();
	    }
	}
    }
}
#[allow(unused_macros)]
macro_rules ! debug { ( $ ( $ a : expr ) ,* ) => { eprintln ! ( concat ! ( $ ( stringify ! ( $ a ) , " = {:?}, " ) ,* ) , $ ( $ a ) ,* ) ; } }
#[doc = " https://github.com/hatoo/competitive-rust-snippets"]
const BIG_STACK_SIZE: bool = true;
#[allow(dead_code)]
fn main() {
    use std::thread;
    if BIG_STACK_SIZE {
	thread::Builder::new()
	    .stack_size(32 * 1024 * 1024)
	    .name("solve".into())
	    .spawn(solve)
	    .unwrap()
	    .join()
	    .unwrap();
    } else {
	solve();
    }
}
fn solve() {
    let out = stdout();
    let mut out = BufWriter::new(out.lock());
    input!{
		n:usize,k:i64,
		c:[usize;9]
    }
	// dbg!(k);
	let mut G = into_digits(10, k);
	G.reverse();
	// dbg!(&G);
	let mut M = vec![];
	for j in 0..9 {
		for _ in 0..c[j] {
			M.push(j as i64+1);
		}
	}
	// dbg!(&M);
	if G.len() < M.len() {
		// Mがベストなのでそのまま出力
		let s = vec_to_string(&M).join("");
		println!("{}", s);
		return
	}
	if G.len() > M.len() {
		println!("-1");
		return;
	}
	assert!(G.len() == M.len());
	// 大きい順にする
	M.reverse();
	let mut gt = false;
	for i in 0..n {
		if M[i] > G[i] {
			gt = true;
			break;
		} else if M[i] < G[i] {
			break;
		}
	}
	if !gt {
		// 大きい順に並べても超えられない
		println!("-1");
		return;
	}
	// 小さい順にする
	M.reverse();
	let mut gt = false;
	for i in 0..n {
		if M[i] > G[i] {
			gt = true;
			break;
		} else if M[i] < G[i] {
			break;
		}
	}
	if gt {
		// 小さい順に並べても超えてしまってるようなので
		// これがベスト
		let s = vec_to_string(&M).join("");
		println!("{}", s);
	} else {
		// 桁数が同じ
		// 小さい順に並べるだけじゃだめ
		// 答えは見つかる
		let mut rem = c.clone();
		let mut M2 = vec![];
		for i in 0..n {
			let k = G[i] as usize;
			if k >= 1 && rem[k-1] > 0 {
				M2.push(k);
				rem[k-1] -= 1;
			} else {
				// なぞることが出来なくなったので、少し大きくして
				// あとは小さい順に吐き出す
				// dbg!(&M2,&rem);

				// 少し大きいのを見つける
				// 必ず見つかる
				for i in k..9 {
					if rem[i] > 0 {
						M2.push(i+1);
						rem[i] -= 1;
						break;
					}
				}
				// 小さい順に吐き出す
				for i in 0..9 {
					for _ in 0..rem[i] {
						M2.push(i+1);
					}
				}
				let s = vec_to_string(&M2).join("");
				println!("{}", s);
				return;
			}
		}
		// 全部なぞってしまった
		// dbg!(&M2);
		for j in (0..n).rev() {
			if M2[j] < M2[n-1] {
				let tmp = M2[n-1];
				M2[n-1] = M2[j];
				M2[j] = tmp;
			}
		}
		let s = vec_to_string(&M2).join("");
		println!("{}", s);
	}
}
pub fn vec_to_string<T: ToString>(xs: &[T]) -> Vec<String> {
	let mut res = vec![];
	for x in xs {
		res.push(x.to_string());
	}
	res
}
pub fn into_digits(b: i64, n: i64) -> Vec<i64> {
	let mut r = vec![];
	let mut n = n;
	while n > 0 {
		let v = n % b;
		r.push(v);
		n -= v;
		n /= b;
	}
	r
}
0