| ||||||||||
| 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 | |||||||||
汗……偶加>8的条件就也过来,哪位达人来解释一下……In Reply To:终于AC了!辛苦辛苦^0^一起切磋java啊!呵呵 Posted by:Jin_j_y at 2004-10-25 19:52:13 > /*************************************************************************
> *终于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