Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
终于AC了!辛苦辛苦^0^一起切磋java啊!呵呵/************************************************************************* *终于AC了!辛苦辛苦^0^一起切磋java啊!呵呵 *WA了4、5遍,都不知道是哪里的问题。后来改了几个地方就AC了。忘了错在哪里。 *结合了一点点动规的思想:如果可以到达value[i],则考虑可以到达的value[j]。 *由于本人对DP不太懂,所以想出来的DP也可能很令人费解。*~*罪过罪过 *但是,始终不明白为什么是8?这个我是抄别人的。 *************************************************************************/ import java.io.*; import java.util.*; public class Main { public static void main(String[] args)throws Exception { BufferedReader cin=new BufferedReader(new InputStreamReader(System.in)); String str; StringTokenizer strtoken; int [] m=new int[6]; int no=0; int i,j,k; //Read in the first case str=cin.readLine(); strtoken=new StringTokenizer(str); for(i=0;i<6;++i) m[i]=Integer.parseInt(strtoken.nextToken()); while(!(m[1]==0&&m[2]==0&&m[3]==0&&m[4]==0&m[5]==0&m[0]==0)) { //Make it smaller for(i=0;i<6;++i) if(m[i]>8){//始终不明白为什么是8?谁能证明啊? if(m[i]%2==0)m[i]=8; else m[i]=7; } int total=0; for(i=0;i<6;++i) if(m[i]>0) total+=m[i]*(i+1); if(total%2==1)//Total is odd, so can't be divided! System.out.println("Collection #"+(++no)+ ":\nCan't be divided.\n"); else{ boolean flag=false; for(i=0;i<6;++i)//Special case,开始的时候这里可能也WA了! if(m[i]>0&&(total/2)>i&&(total/2)%(i+1)==0&& (total/2)/(i+1)<=m[i]){ System.out.println("Collection #"+ (++no)+":\nCan be divided.\n"); flag=true;break; } //Normal case if(flag==false){ BitSet value=new BitSet(total+1); int [] last=new int[total+1]; total/=2; value.set(0); Arrays.fill(last,0); for(i=0;i<total;++i) if(value.get(i)){//已经到达的一个value值 for(j=last[i];j<6;++j)//last是指到达这个value值 //使用的marble的种类(编号最小) if(m[j]>0){ for(k=1;k<=m[j];++k) { int temp=i+(j+1)*k; //可以到达的另一个value值 if(temp>total)break; value.set(temp); if(last[temp]==0||last[temp]>j+1) last[temp]=j+1;//WA在这里了!呵呵 } } if(value.get(total))break; } if(value.get(total)) System.out.println("Collection #"+(++no)+ ":\nCan be divided.\n"); else System.out.println("Collection #"+(++no)+ ":\nCan't be divided.\n"); } } //New Case str=cin.readLine(); strtoken=new StringTokenizer(str); for(i=0;i<6;++i) m[i]=Integer.parseInt(strtoken.nextToken()); } //System.exit(0); } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator