kmjp's blog

競技プログラミング参加記です

yukicoder : No.2734 Addition and Multiplication in yukicoder (Hard)

このテクは以前見たな。
https://yukicoder.me/problems/no/2734

問題

N個の整数が与えられる。
これらを任意の順に並べ替え、文字列的に連結して整数を作る。
その場合の最小値を、998244353で割った値を求めよ。

解法

整数A,Bを文字列的に連結する場合、A+BとB+A (いずれも整数でなく文字列的に連結)のうち小さい方を取れば小さい値になる。
整数が複数個ある場合、同様の比較関数を用いてソートすると、問題文の条件を満たす順番を得られる。

int N;
string S[202020];
const ll mo=998244353;

bool cmp(string a,string b) {
	return a+b<b+a;
}

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	FOR(i,N) cin>>S[i];
	sort(S,S+N,cmp);
	ll ret=0;
	FOR(i,N) {
		FORR(c,S[i]) ret=(ret*10+c-'0')%mo;
	}
	cout<<ret<<endl;
}

まとめ

このテク最初に見たのはARCのだいぶ初期だったか?