結果

問題 No.775 tatyamと素数大富豪(hard)
ユーザー kriii
提出日時 2018-12-22 01:50:29
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 47 ms / 2,000 ms
コード長 1,067 bytes
コンパイル時間 428 ms
コンパイル使用メモリ 46,084 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-10-14 01:32:32
合計ジャッジ時間 1,148 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 5
other AC * 10
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <stdio.h>
#include <algorithm>
using namespace std;
int N,K,L,A[202],C[100],U[100],X;
bool good(int a, int r, int l = 0)
{
if (X < a) X = a;
if ((L - a) / 2 < r) return false;
if (a == L) return true;
if (a + 2 <= L && A[a]){
int u = A[a] * 10 + A[a+1];
if (u != l * 11){
int &v = U[u];
if (v < C[u]){
v++;
if (good(a+2, r-1, u)) return true;
v--;
}
}
}
int &v = U[A[a]];
if (v < C[A[a]]){
v++;
if (good(a+1, r, A[a])) return true;
v--;
}
return false;
}
int main()
{
#ifdef __LOCAL
freopen ("input.txt","r",stdin);
#endif
scanf ("%d %d",&N,&K);
for (int i=0;i<N;i++){
int x; scanf ("%d",&x); C[x]++;
if (x < 10) A[L++] = x;
else A[L++] = x / 10, A[L++] = x % 10;
}
sort(A,A+L);
reverse(A,A+L);
int rem = 0;
for (int i=10;i<100;i++) rem += C[i];
do{
for (int i=0;i<100;i++) U[i] = 0;
X = 0;
if (good(0,rem)){
for (int i=0;i<L;i++) printf ("%d",A[i]);
puts("");
if (--K == 0) break;
}
else{
if (X + 2 < L) sort(A+X+2,A+L);
}
}while(prev_permutation(A,A+L));
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0