結果
| 問題 |
No.15 カタログショッピング
|
| コンテスト | |
| ユーザー |
holeguma
|
| 提出日時 | 2015-10-12 01:23:11 |
| 言語 | Java (openjdk 23) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 5,596 bytes |
| コンパイル時間 | 2,210 ms |
| コンパイル使用メモリ | 92,968 KB |
| 実行使用メモリ | 48,264 KB |
| 最終ジャッジ日時 | 2024-07-21 07:07:27 |
| 合計ジャッジ時間 | 4,005 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 1 WA * 8 RE * 1 |
ソースコード
import java.io.InputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Comparator;
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.InputMismatchException;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.PriorityQueue;
import java.util.TreeMap;
import java.util.TreeSet;
import java.math.BigDecimal;
import java.math.BigInteger;
public class Main{
static PrintWriter out;
static InputReader ir;
static final int INF=Integer.MAX_VALUE;
static final long LINF=Long.MAX_VALUE;
static void solve(){
int n=ir.nextInt();
int s=ir.nextInt();
int[] p=ir.nextIntArray(n);
int r=n/2;
int l=n-r;
ArrayList<Long> list=new ArrayList<Long>();
ArrayList<Pair> right=new ArrayList<Pair>();
ArrayList<Pair> left=new ArrayList<Pair>();
for(int i=0;i<1<<r;i++){
int res=0;
for(int j=0;j<r;j++){
if((i&(1<<j))!=0) res+=p[j];
}
if(res<=s) right.add(new Pair(res,(long)i));
}
for(int i=0;i<1<<l;i++){
int res=0;
for(int j=0;j<l;j++){
if((i&(1<<j))!=0) res+=p[r+j];
}
if(res<=s) left.add(new Pair(res,(long)(r<<i)));
}
Collections.sort(left,Pair.X_ORDER);
int[] arr=new int[left.size()];
for(int i=0;i<left.size();i++) arr[i]=left.get(i).x;
for(int i=0;i<right.size();i++){
Pair pp=right.get(i);
int ub=upper_bound(arr,0,arr.length-1,s-pp.x);
int lb=lower_bound(arr,0,arr.length-1,s-pp.x);
if(ub-lb>0){
for(int j=lb;j<ub;j++){
list.add(left.get(j).y|pp.y);
}
}
}
Collections.sort(list,new Comparator<Long>(){
public int compare(Long a,Long b){
for(int i=0;i<n;i++){
if((a&(long)(1<<i))==0&&(b&(1<<i))!=0) return 1;
if((a&(long)(1<<i))!=0&&(b&(1<<i))==0) return -1;
}
return 0;
}
});
for(int i=0;i<list.size();i++){
long a=list.get(i);
StringBuilder sb=new StringBuilder();
for(int j=0;j<n;j++){
if((a&(long)(1<<j))!=0){
sb.append(j+1);
sb.append(" ");
}
}
sb.deleteCharAt(sb.length()-1);
out.println(sb);
}
}
public static void main(String[] args) throws Exception{
ir=new InputReader(System.in);
out=new PrintWriter(System.out);
solve();
out.flush();
}
static class Pair{
int x;
long y;
public Pair(int x,long y){
this.x=x; this.y=y;
}
public static Comparator<Pair> X_ORDER=new Comp1();
public static Comparator<Pair> Y_ORDER=new Comp2();
private static class Comp1 implements Comparator<Pair>{
public int compare(Pair p1,Pair p2){
return (p1.x>p2.x)?1:(p1.x<p2.x)?-1:0;
}
}
private static class Comp2 implements Comparator<Pair>{
public int compare(Pair p1,Pair p2){
return (p1.y>p2.y)?1:(p1.y<p2.y)?-1:0;
}
}
}
public static int lower_bound(int[] a,int fromIndex,int toIndex,int val){
if(a[fromIndex]>=val) return fromIndex;
if(a[toIndex]<val) return toIndex+1;
int lb=fromIndex-1,ub=toIndex;
while(ub-lb>1){
int mid=(ub+lb)/2;
if(a[mid]>=val){
ub=mid;
}
else{
lb=mid;
}
}
return ub;
}
public static int upper_bound(int[] a,int fromIndex,int toIndex,int val){
if(a[fromIndex]>val) return fromIndex;
if(a[toIndex]<=val) return toIndex+1;
int lb=fromIndex-1,ub=toIndex;
while(ub-lb>1){
int mid=(ub+lb)/2;
if(a[mid]>val){
ub=mid;
}
else{
lb=mid;
}
}
return ub;
}
static class InputReader {
private InputStream in;
private byte[] buffer=new byte[1024];
private int curbuf;
private int lenbuf;
public InputReader(InputStream in) {this.in=in; this.curbuf=this.lenbuf=0;}
public boolean hasNextByte() {
if(curbuf>=lenbuf){
curbuf= 0;
try{
lenbuf=in.read(buffer);
}catch(IOException e) {
throw new InputMismatchException();
}
if(lenbuf<=0) return false;
}
return true;
}
private int readByte(){if(hasNextByte()) return buffer[curbuf++]; else return -1;}
private boolean isSpaceChar(int c){return !(c>=33&&c<=126);}
private void skip(){while(hasNextByte()&&isSpaceChar(buffer[curbuf])) curbuf++;}
public boolean hasNext(){skip(); return hasNextByte();}
public String next(){
if(!hasNext()) throw new NoSuchElementException();
StringBuilder sb=new StringBuilder();
int b=readByte();
while(!isSpaceChar(b)){
sb.appendCodePoint(b);
b=readByte();
}
return sb.toString();
}
public int nextInt() {
if(!hasNext()) throw new NoSuchElementException();
int c=readByte();
while (isSpaceChar(c)) c=readByte();
boolean minus=false;
if (c=='-') {
minus=true;
c=readByte();
}
int res=0;
do{
if(c<'0'||c>'9') throw new InputMismatchException();
res=res*10+c-'0';
c=readByte();
}while(!isSpaceChar(c));
return (minus)?-res:res;
}
public long nextLong() {
if(!hasNext()) throw new NoSuchElementException();
int c=readByte();
while (isSpaceChar(c)) c=readByte();
boolean minus=false;
if (c=='-') {
minus=true;
c=readByte();
}
long res = 0;
do{
if(c<'0'||c>'9') throw new InputMismatchException();
res=res*10+c-'0';
c=readByte();
}while(!isSpaceChar(c));
return (minus)?-res:res;
}
public double nextDouble(){return Double.parseDouble(next());}
public BigInteger nextBigInteger(){return new BigInteger(next());}
public BigDecimal nextBigDecimal(){return new BigDecimal(next());}
public int[] nextIntArray(int n){
int[] a=new int[n];
for(int i=0;i<n;i++) a[i]=nextInt();
return a;
}
public char[][] nextCharMap(int n,int m){
char[][] map=new char[n][m];
for(int i=0;i<n;i++) map[i]=next().toCharArray();
return map;
}
}
}
holeguma