結果

問題 No.15 カタログショッピング
ユーザー shisyamokongarishisyamokongari
提出日時 2016-09-29 17:18:49
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 2,940 bytes
コンパイル時間 2,893 ms
コンパイル使用メモリ 70,724 KB
実行使用メモリ 8,920 KB
最終ジャッジ日時 2023-08-13 14:53:16
合計ジャッジ時間 1,885 ms
ジャッジサーバーID
(参考情報)
judge13 / judge11
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,380 KB
testcase_01 AC 1 ms
4,376 KB
testcase_02 AC 2 ms
4,384 KB
testcase_03 AC 2 ms
4,376 KB
testcase_04 AC 1 ms
4,380 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:114:7: warning: ‘mid’ may be used uninitialized in this function [-Wmaybe-uninitialized]
   int mid;
       ^~~

ソースコード

diff #

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

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];

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 prc=0;
		if(l[i].P==B){
			for(int j=0;j<N;j++){
				if(l[i].ok[j]) prc++;
			}
			for(int j=0;j<N;j++){
				if(l[i].ok[j]) {
					cout<<j+1;
					if(prc==1) cout<<endl;
					else cout<<" ";
					prc--;
				}
			}
		}
	}
	for(int i=0;i<l.size();i++){
		if(l[i].P==B) continue;
		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) continue;
        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;
				int prc=0;
				for(int j=0;j<N;j++){
					if(l[i].ok[j]) prc++;
				}
				for(int j=0;j<N;j++){
					if(h[mid].ok[j]) prc++;
				}
				for(int j=0;j<N;j++){
					if(l[i].ok[j]) {
						cout<<j+1;
						if(prc==1) cout<<endl;
						else cout<<" ";
						prc--;
					}
				}
				for(int j=0;j<N;j++){
					if(h[mid].ok[j]){
						cout<<j+1;
						if(prc==1) cout<<endl;
						else cout<<" ";
						prc--;
					}
				}
				mid++;
			}
		}
    }
	for(int i=0;i<h.size();i++){
		int prc=0;
		if(h[i].P==B){
			int prc=0;
			for(int j=0;j<N;j++){
				if(h[i].ok[j]) prc++;
			}
			for(int j=0;j<N;j++){
				if(h[i].ok[j]) {
					cout<<j+1;
					if(prc==1) cout<<endl;
					else cout<<" ";
					prc--;
				}
			}
		}
	}
	return 0;
}
0