結果

問題 No.15 カタログショッピング
ユーザー shisyamokongarishisyamokongari
提出日時 2016-09-29 17:47:22
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 25 ms / 5,000 ms
コード長 2,453 bytes
コンパイル時間 888 ms
コンパイル使用メモリ 78,364 KB
実行使用メモリ 8,020 KB
最終ジャッジ日時 2024-11-21 10:34:41
合計ジャッジ時間 1,545 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,248 KB
testcase_02 AC 1 ms
5,248 KB
testcase_03 AC 2 ms
5,248 KB
testcase_04 AC 2 ms
5,248 KB
testcase_05 AC 23 ms
7,892 KB
testcase_06 AC 24 ms
7,888 KB
testcase_07 AC 24 ms
8,016 KB
testcase_08 AC 25 ms
8,020 KB
testcase_09 AC 25 ms
8,016 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:111:17: warning: ‘mid’ may be used uninitialized in this function [-Wmaybe-uninitialized]
  111 |         if(h[mid].P==B-l[i].P){
      |                 ^

ソースコード

diff #

#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>

using namespace std;

#define NMAX 40

typedef struct s{
	long long P;
	bool ok[NMAX];
} S;

int N,B;
long long A[NMAX];
vector<S> l,h;
bool sel[NMAX];
bool search_end;
bool ok[NMAX];
vector<long long> vok;
bool operator<(S a,S b){
	if(a.P==b.P){
		for(int i=0;i<N;i++){
			if(a.ok[i]&&!b.ok[i]) return true;
			if(!a.ok[i]&&b.ok[i]) return false;
		}
		return true;
	}
	return a.P<b.P;
}

void ans_out(){
	int cnt=0;
	for(int i=0;i<N;i++) if(sel[i]) cnt++;
	for(int i=0;i<N;i++){
		if(sel[i]){
			cout<<A[i];
			cnt--;
			if(cnt) cout<<" ";
		}
	}
	cout<<endl;
	return;
}

void search(int m,int sum,int to,int M){
	if(to==m){
		
		if(sum==M) search_end=true;
		return;
	}
	sel[m]=true;
	search(m+1,sum+A[m],to,M);
	if(search_end) return;
	sel[m]=false;
	search(m+1,sum,to,M);
	return;
}

void all(int m,int sum,int to,int mode){ /*mode 0-l mode1-h*/
	if(m==to){
		S tmps;
		tmps.P=sum;
		for(int i=0;i<N;i++){
			tmps.ok[i]=ok[i];
		}
		if(mode==0) l.push_back(tmps);
		else h.push_back(tmps);
		return;
	}
	ok[m]=true;
	all(m+1,sum+A[m],to,mode);
	ok[m]=false;
	all(m+1,sum,to,mode);
	return;
}

int main(){

	cin>>N;
	cin>>B;
	for(int i=0;i<N;i++){
		cin>>A[i];
		sel[i]=false;
	}

	for(int i=0;i<N;i++) ok[i]=false;
	all(0,0,N/2,0);
	all(N/2,0,N,1);

	sort(h.begin(),h.end());
	sort(l.begin(),l.end());

	for(int i=0;i<l.size();i++){
		int lef=0;
        int rig=h.size()-1;
		int mid;

        while(lef<=rig){
			
            mid=(lef+rig) / 2;
            if(h[mid].P<B-l[i].P){
                lef=mid+1;
            }
            else if(h[mid].P>B-l[i].P){
                rig=mid-1;
            }
            else break;
        }
        if(h[mid].P==B-l[i].P){
			while(mid>=1){
				if(h[mid].P==h[mid-1].P) mid--;
				else break;
			}
			int f=true;
			while(mid<h.size()){
				if(mid!=0){
					if(h[mid].P!=h[mid-1].P&&!f) break;
				}
				f=false;
				long long vv=0;
				for(int j=0;j<N/2;j++){
					vv=vv*=2;
					if(l[i].ok[j]){
						vv++;
					}
				}
				for(int j=N/2;j<N;j++){
					vv=vv*=2;
					if(h[mid].ok[j]){
						vv++;
					}
				}
				vok.push_back(vv);
				mid++;
			}
		}
    }
	
	sort(vok.begin(),vok.end());

	for(int i=vok.size()-1;i>=0;i--){
		long long waru=1;
		for(int i=0;i<N-1;i++) waru*=2;
		int n=1;
		while(waru!=0){
			if(waru<=vok[i]){
				cout<<n<<" ";
				vok[i]-=waru;
			}
			waru/=2;
			n++;
		}
		cout<<endl;
	}
	return 0;
}
0