java在ACM竞赛中的使用

        java简单功能强大,高精度类可以帮队员轻松地实现对大数操作,而不用C/C++手写高精度。使用java做题,不容易犯一些低级的错误,如: if (a = b)。刚刚接触acm的时候,笔者还不会使用java,为此还特地花了一个月时间学习了一下java语言。现在回过头来发现,学会在比赛中熟练地使用java其实根本不需要花很长时间......所以在这里小结一下java在acm比赛中的使用。

        1.开发环境

        打开喜闻乐见的Eclipse->新建一个Java Project->新建一个class。

        2.基本框架

import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
	public static void main(String[] args)
	{
		
		System.out.println("Hello,ACM");
	}
}


        注:每道题通常都会注明java类名,如,BNUOJ的 Java class name:  Main ,类名必须要和其要求的一样。

        3.读取数据

import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
	public static void main(String[] args)
	{
		Scanner cin=new Scanner(System.in);
		int n;
		n=cin.nextInt();
		System.out.println(n);
	}
}
         4.输出结果

         例题:BNUOJ 1004 新生指导

import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
	public static void main(String[] args)
	{
		Scanner cin=new Scanner(new BufferedInputStream(System.in));
		while (cin.hasNext())
		{
			int n;
			n=cin.nextInt();
			System.out.println(n);
		}
	}
}

         5.数学函数

import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
	public static void main(String[] args)
	{
		Scanner cin=new Scanner(new BufferedInputStream(System.in));
		while (cin.hasNext())
		{
			int n;
			n=cin.nextInt();
			System.out.println(Math.sqrt(n));
		}
	}
}

        6.高精度整数BigInteger类

        例题:POJ 1503 Integer Inquiry

import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
    public static void main(String[] args)
    {
        BigInteger b1,sum;
        Scanner cin=new Scanner(new BufferedInputStream(System.in));
        sum=new BigInteger("0");
        while (cin.hasNext())
        {
            b1=cin.nextBigInteger();
            if (b1.compareTo(new BigInteger("0")) == 0)
            {
                break;
            }
            sum=sum.add(b1);
        }
        System.out.println(sum);
    }
}

        7.高精度小数BigDecimal类

        例题:POJ 1001 Exponentiation

import java.math.*;
import java.util.*;
import java.io.*;
public class Main 
{
     public static void main(String[] args) 
     {
          Scanner in = new Scanner(System.in);
          while (in.hasNext()) 
          {
               BigDecimal R = in.nextBigDecimal();
               int n = in.nextInt();
               R = R.pow(n);
               String str = R.stripTrailingZeros().toPlainString();
               if (str.startsWith("0."))
                   str = str.substring(1);
               System.out.println(str);
          }
     }
}
      

        注:

        stripTrailingZeros() 
        返回类型为BigDecimal的小于此数的但除去尾部的0的数值。
        toPlainString()
        返回BigDecimal类型的String类型字符串。
        startsWith()
        确定此实例的开头是否与指定的字符串匹配。
        substring()
        返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。


        

        8.进制转换

        String st = Integer.toString(num, base);
         // 把num当做10进制的数转成base进制的st(base <= 35).
        int num = Integer.parseInt(st, base); 
        // 把st当做base进制,转成10进制的int(parseInt有两个参数,第一个为要转的字符串,第二个为说明是什么进制).   
        BigInter m = new BigInteger(st, base); 
        // st是字符串,base是st的进制.
                

        如果要将一个大数以2进制形式读入 可以使用cin.nextBigInteger(2); 当然也可以使用其他进制方式读入;
        如果要将一个大数转换成其他进制形式的字符串 使用cin.toString(2);//将它转换成2进制表示的字符串

      例题:POJ 2305 Basic remains

import java.io.*;
import java.util.*;
import java.math.*;

public class Main
{
    public static void main(String[] args)
    {
        int b;
        BigInteger p,m,ans;
        String str ;
        Scanner cin = new Scanner (new BufferedInputStream(System.in));
        while(cin.hasNext())
        {
            b=cin.nextInt();
            if(b==0)
                break;
            p=cin.nextBigInteger(b);
            m=cin.nextBigInteger(b);
            ans=p.mod(m);
            str=ans.toString(b);
            System.out.println(str);
        }
    }
}

         9.多线程编程

         在acm/icpc信息战看到的这篇文章中,提到了比赛中可以使用多线程,并且存在java优化时间常数的可能。故此处把这多线程运用也是列一下。

        例题:BNUOJ 1021 信息战(七)——情报传递

import java.math.BigInteger;
import java.util.*;
public class Main extends Thread
{
    public static Scanner cin=new Scanner(System.in);
    public int dir[][]={{1,0},{-1,0},{0,1},{0,-1}};
    public int x,y,m,n,p,px[],py[];
    public boolean ck[][];
    public BigInteger dp[][];
    public boolean flag;
    public void readData(Scanner cin)
    {
        int i,j;
        x=cin.nextInt();
        y=cin.nextInt();
        m=cin.nextInt();
        n=cin.nextInt();
        p=cin.nextInt();
        ck=new boolean[201][201];
        dp=new BigInteger[201][201];
        px=new int[p];
        py=new int[p];
        for (i=0; i<p; i++)
        {
            px[i]=cin.nextInt();
            py[i]=cin.nextInt();
        }
        flag=false;
    }
    public boolean judge(int x,int y)
    {
        if (x < 0 || x > 200 || y < 0 || y > 200)
            return false;
        if (ck[x][y] == false)
            return false;
        return true;
    }
    public void run()
    {
        int i,j;
        int tx=1,ty=1;
        for (i=0; i<201; i++)
        {
            for (j=0; j<201; j++)
            {
                ck[i][j]=true;
                dp[i][j]=BigInteger.ZERO;
            }
        }
        for (i=0; i<p; i++)
        {
            ck[px[i]][py[i]]=false;
            for (j=0; j<4; j++)
            {
                tx=px[i]+dir[j][0];
                ty=py[i]+dir[j][1];
                if (judge(tx,ty) == true)
                    ck[tx][ty]=false;
            }
        }
        dp[x][y]=BigInteger.ONE;
        if(x>m) 
            tx=-1;
        else
            tx=1;
        if(y>n) 
            ty=-1;
        else
            ty=1;
        for(i=x+tx;i!=m+tx;i+=tx)
        {
            if(judge(i,y)) dp[i][y]=dp[i][y].add(dp[i-tx][y]);
        }
        for(j=y+ty;j!=n+ty;j+=ty)
        {
            if(judge(x,j)) dp[x][j]=dp[x][j].add(dp[x][j-ty]);
        }
        for(i=x+tx;i!=m+tx;i+=tx)
        {
            for(j=y+ty;j!=n+ty;j+=ty)
            {
                if(judge(i,j) == false) continue;
                dp[i][j]=dp[i][j].add(dp[i-tx][j]).add(dp[i][j-ty]);
            }
        }
        flag=true;
    }
    public static void main(String[] args) 
    {
        Main m[];
        int prob,i;
        prob=cin.nextInt();
        m=new Main[prob];
        for (i=0; i<prob; i++)
        {
            m[i]=new Main();
            m[i].readData(cin);
            m[i].start();
        }
        for (i=0; i<prob; )
        {
            if (m[i].flag == true)
            {
                System.out.println(m[i].dp[m[i].m][m[i].n]);
                i++;
            }
        }
    }
}



  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值