結果
問題 | No.775 tatyamと素数大富豪(hard) |
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
#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 __LOCALfreopen ("input.txt","r",stdin);#endifscanf ("%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;}