結果
問題 | No.332 数列をプレゼントに |
ユーザー |
![]() |
提出日時 | 2015-12-25 13:11:39 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
RE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,743 bytes |
コンパイル時間 | 321 ms |
コンパイル使用メモリ | 24,704 KB |
実行使用メモリ | 10,496 KB |
最終ジャッジ日時 | 2024-09-18 23:46:45 |
合計ジャッジ時間 | 2,635 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 41 RE * 1 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:43:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 43 | scanf("%d%lld", &n, &x); | ~~~~~^~~~~~~~~~~~~~~~~~ main.cpp:47:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 47 | scanf("%d", &a[i]); | ~~~~~^~~~~~~~~~~~~
ソースコード
#include <stdio.h>#define LIM 57797#define SUM (LIM + 79)int n, a[100], s_sum[SUM], s_ans[SUM + 1][100], s_c = 1;long long int x, l_sum[1<<20], l_c;int b[100], b_copy[100], index_[100], i_copy[100], rank[100];void sort(int l, int r) {if(l == r) { return; }int m = (l + r) / 2;sort(l , m);sort(m + 1, r);int lc = l, rc = m + 1, cc = l;while(cc <= r) {if(r < rc || (lc <= m && b[lc] >= b[rc]) ) {b_copy[cc] = b[lc];i_copy[cc] = index_[lc];lc++; cc++;} else {b_copy[cc] = b[rc];i_copy[cc] = index_[rc];rc++; cc++;}}int i;for(i = l; i <= r; i++) {b[i] = b_copy[i];index_[i] = i_copy[i];}return;}int main(void) {s_sum[0] = s_c;s_c++;scanf("%d%lld", &n, &x);int i, j, k, l_c = 0;for(i = 0; i < n; i++) {scanf("%d", &a[i]);b[i] = a[i];index_[i] = i;}sort(0, n - 1);for(i = 0; i < n; i++) {rank[ index_[i] ] = i;}for(i = 0; i < n; i++) {if(20 <= rank[i]) {for(j = SUM - 1; 0 <= j; j--) {if(s_sum[j] != 0 && s_sum[ j + a[i] ] == 0) {for(k = 0; k < i; k++) {s_ans[s_c][k] = s_ans[ s_sum[j] ][k];}s_ans[s_c][i] = 1;s_sum[ j + a[i] ] = s_c;s_c++;}}} else {for(j = 0; j < (1 << l_c); j++) {l_sum[ j + (1 << l_c) ] = l_sum[j] + a[i];}l_c++;}}int flag = 0;for(j = 0; j < (1 << l_c); j++) {long long int v = x - l_sum[j];if(0 <= v && v < SUM && s_sum[v] != 0) {flag = 1;for(i = 0; i < n; i++) {if(20 <= rank[i]) {printf("%c", s_ans[ s_sum[v] ][i] ? 'o' : 'x');} else {printf("%c", j % 2 ? 'o' : 'x');j /= 2;}}printf("\n");break;}}if(! flag) { printf("No\n"); }return 0;}