結果

問題 No.15 カタログショッピング
ユーザー k82bk82b
提出日時 2023-10-10 20:48:30
言語 D
(dmd 2.106.1)
結果
AC  
実行時間 46 ms / 5,000 ms
コード長 1,705 bytes
コンパイル時間 2,933 ms
コンパイル使用メモリ 229,460 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-09-13 00:18:10
合計ジャッジ時間 3,971 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,816 KB
testcase_01 AC 2 ms
6,816 KB
testcase_02 AC 2 ms
6,940 KB
testcase_03 AC 2 ms
6,944 KB
testcase_04 AC 1 ms
6,944 KB
testcase_05 AC 40 ms
6,944 KB
testcase_06 AC 43 ms
6,944 KB
testcase_07 AC 46 ms
6,944 KB
testcase_08 AC 45 ms
6,944 KB
testcase_09 AC 45 ms
6,940 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

void main()
{
	alias Entry = Tuple!(int, "x", int, "y");
	const N = readInt;
	const S = readInt;
	auto P = new int[N];
	int n = N / 2, m = N - N / 2;
	auto A = new int[n];
	auto B = new int[m];
	foreach (i; 0 .. n) A[i] = readInt;
	foreach (i; 0 .. m) B[i] = readInt;
	Entry[] C, D;
	foreach (i; 0 .. 1 << n) {
		int now, b;
		foreach (j; 0 .. n) if (i >> j & 1) {
			now += A[j];
			b |= 1 << j;
		}
		C ~= Entry(now, b);
	}
	foreach (i; 0 .. 1 << m) {
		int now, b;
		foreach (j; 0 .. m) if (i >> j & 1) {
			now += B[j];
			b |= 1 << (n + j);
		}
		D ~= Entry(now, b);
	}
	D.sort;
	int[][] ans;
	foreach (i; 0 .. cast(int)(C.length)) {
		int l = lowerBound(D, Entry(S - C[i].x, 0));
		int r = lowerBound(D, Entry(S - C[i].x + 1, 0));
		if (l != cast(int)(D.length) && D[l].x == S - C[i].x) {
			foreach (j; l .. r) {
				int[] a;
				foreach (k; 0 .. N) {
					if (C[i].y >> k & 1 || D[j].y >> k & 1) {
						a ~= k + 1;
					}
				}
				ans ~= a;
			}
		}
	}
	ans.sort;
	writefln("%(%(%s %)\n%)", ans);
}

import std,core.bitop;
string[]_R;
string readString(){while(_R.empty){_R=readln.chomp.split;}auto ret=_R.front;_R.popFront;return ret;}
int readInt(){return readString.to!int;}
long readLong(){return readString.to!long;}
ulong readULong(){return readString.to!ulong;}
real readReal(){return readString.to!real;}
bool chmin(T)(ref T A,T B){if(A>B){A=B;return true;}else{return false;}}
bool chmax(T)(ref T A,T B){if(A<B){A=B;return true;}else{return false;}}
int lowerBound(T)(T[]A,T x){int L=-1,R=cast(int)A.length;while(R-L>1){int mid=(L+R)/2;(A[mid]<x?L:R)=mid;}return R;}
int upperBound(T)(T[]A,T x){int L=-1,R=cast(int)A.length;while(R-L>1){int mid=(L+R)/2;(A[mid]<=x?L:R)=mid;}return R;}
0