首页 > 代码库 > poj 1750 java

poj 1750 java

这道题很坑爹,稍微不注意不是PE就是RA要么TLE。

先说下题意:

题干描述的不是很清晰,主要是通过题目给的例子自己总结的,(这个很关键,没找着好的规律永远会TLE):

规律:后面一个字符串和前面一个字符串比较,如果前几位相同的字符数量大于空格的数量,那么空格的数量加1,如果前几位相同字符数量小于空格的数量,那么空格数量变为相同字符的数量。

 

  网上用java实现的代码基本没找着,没办法,之前poj上一共就4位前辈用java Ac的,只能自己动手了,

开始我直接暴力比较直接打印,最后把RA解决了,但是很遗憾TLE了,

这道题用C,C++都要500Ms+,用java还是有点难度的,

我优化了半天,费尽了脑汁,终于AC了:

下面代码与懒人共享:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main {    public static StringBuffer[]b=new StringBuffer[11];    public static int blank;    public static void main(String[]args) throws IOException{        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        String str="" ;        String next;        blank=0;        init();        while((next = in.readLine())!=null){            Write(str,next);                str = next;        }    }    public static void Write(String str,String next){        int same = gsn(str,next);        if(same>blank){            blank++;        }else if(same<blank){            blank=same;        }        System.out.println(b[blank]+next);        }    public static int gsn(String s1,String s2){//getSameNumber        int len = s1.length()>s2.length()?s2.length():s1.length();        int i;        for(i=0;i<len;i++){            if(s1.charAt(i)!=s2.charAt(i)){                break;            }        }        return i;    }        public static void init(){        StringBuffer sb ;        for(int i=0;i<11;i++){            sb = new StringBuffer("");            for(int j=0;j<i;j++){                sb.append(" ");            }            b[i]=sb;        }    }}

补充一下,那个空格的打印很浪费时间,java中貌似没有直接打印几个空格的方法,如果每次都用for实现,那么肯定TLE, 由于字符串长度不大于10,所以我用了打表,这个能节约不少时间。

poj 1750 java