Yandex.Algorithm 2014
Yandex.Algorithm 2014 Round 1
問題文
$N$ 個の正整数 $A_1,A_2,\ldots,A_N$ が与えられる.
$0$ から初めて,与えられた整数 $A_1,A_2,\ldots,A_N$ を順番に足し込んでいく.
この際,それぞれの整数を足した後の結果に対して,各桁を自由に入れ替えて良い.(ゼロが先頭に来たらそれは即座に削除される)
全ての整数を足し終えた時に得られる整数の最大値を求める問題.
どんなに大きくなろうとも,最初 $3$ 桁から始まって,その後は $1$ 桁ずつしか増えないから,高々 $7$ 桁の整数にしかなりえないことがわかる.
実際には,もっともっと小さい.($2$ 個目で $4$ 桁になるのも不可能)
そこで,各足し算の後に,取りうる整数を全て列挙して,そこから次の足し算の後に取りうる整数を全部列挙すると計算しても十分に間に合う.
#include<bits/stdc++.h>
using namespace std;
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)
#define mygc(c) (c)=getchar_unlocked()
#define mypc(c) putchar_unlocked(c)
#define ll long long
void reader(int *x){int k,m=0;*x=0;for(;;){mygc(k);if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){*x=k-'0';break;}}for(;;){mygc(k);if(k<'0'||k>'9')break;*x=(*x)*10+k-'0';}if(m)(*x)=-(*x);}
void writer(ll x, char c){int i,sz=0,m=0;char buf[20];if(x<0)m=1,x=-x;while(x)buf[sz++]=x%10,x/=10;if(!sz)buf[sz++]=0;if(m)mypc('-');while(sz--)mypc(buf[sz]+'0');mypc(c);}
int N, A[10];
ll dp[10000], nx[10000], dp_size, nx_size;
ll stoii(string &S){
int i;
ll res = 0;
rep(i,S.size()) res = res * 10 + S[i] - '0';
return res;
}
int main(){
int i, j, k;
string S;
char buf[1000];
ll tmp;
reader(&N);
rep(i,N) reader(A+i);
dp[0] = 0;
dp_size = 1;
rep(k,N){
nx_size = 0;
rep(i,dp_size){
tmp = dp[i] + A[k];
sprintf(buf,"%lld",tmp);
S = buf;
sort(S.begin(), S.end());
do{
nx[nx_size++] = stoii(S);
}while(next_permutation(S.begin(),S.end()));
}
sort(nx, nx+nx_size);
dp_size = 0;
rep(i,nx_size){
if(dp_size && nx[i] == dp[dp_size-1]) continue;
dp[dp_size++] = nx[i];
}
// rep(i,dp_size) printf("%d %lld\n",i,dp[i]);
}
sort(dp,dp+dp_size);
writer(dp[dp_size-1], '\n');
return 0;
}
Current time: 2024年03月19日18時18分13秒
Last modified: 2014年06月25日20時29分33秒 (by laycrs)
Tags: Competitive_Programming Yandex_Algorithm Yandex_Algorithm_2014 Yandex_Algorithm_2014_Round1
トップページに戻る
Logged in as: unknown user (not login)