java时间限制_Java问题时间限制超出问题

我编码问题(参考--http://www.codechef.com/FEB11/problems/THREECLR/)

以下是我的代码

import java.io.*;

import java.util.*;

public class Main {

static String ReadLn (int maxLg) // utility function to read from stdin

{

byte lin[] = new byte [maxLg];

int lg = 0, car = -1;

String line = "";

try

{

while (lg < maxLg)

{

car = System.in.read();

if ((car < 0) || (car == '\n')) break;

lin [lg++] += car;

}

}

catch (IOException e)

{

return (null);

}

if ((car < 0) && (lg == 0)) return (null); // eof

return (new String (lin, 0, lg));

}

public static boolean iscontains(HashMap> resultmap,HashSet b, int index)

{

boolean result=false;

for(Iterator iter = b.iterator();iter.hasNext();)

{ int tmp=Integer.valueOf(iter.next().toString());

if(resultmap.get(index).contains(tmp))

result=true;

}

return result;

}

public static void main(String[] args) throws InterruptedException, FileNotFoundException {

try {

HashMap> pairlist = new HashMap>();

String input=null;

StringTokenizer idata;

int tc=0;

input=Main.ReadLn(255);

tc=Integer.parseInt(input);

while(--tc>=0)

{

input=Main.ReadLn(255);

idata = new StringTokenizer (input);idata = new StringTokenizer (input);

int dishnum= Integer.parseInt(idata.nextToken());

int pairnum= Integer.parseInt(idata.nextToken());

while (--pairnum>=0)

{

input=Main.ReadLn(255);

idata = new StringTokenizer (input);idata = new StringTokenizer (input);

int dish1=Integer.parseInt(idata.nextToken());

int dish2=Integer.parseInt(idata.nextToken());

if(pairlist.containsKey((Integer)dish1))

{

HashSet dishes=new HashSet();

dishes=pairlist.get(dish1);

dishes.add(dish2);

pairlist.put(dish1, dishes);

}

else

{

HashSet dishes=new HashSet();

dishes.add(dish2);

pairlist.put(dish1, dishes);

}

}

int maxrounds=1;

HashMap> resultlist = new HashMap>();

HashSet addresult=new HashSet();

addresult.add(1);

resultlist.put(1,addresult);

System.out.print("1");

for(int i=2;i<=dishnum;i++)

{

boolean found_one=false;

boolean second_check=false;

int minroundnum=maxrounds;

boolean pairlistcontains=false;

pairlistcontains=pairlist.containsKey(i);

for(int j=maxrounds;j>=1;j--)

{

if(!found_one){

if(pairlistcontains)

{

if(!iscontains(resultlist,pairlist.get((Integer) i),j))

{

for(Iterator resultiter = resultlist.get(j).iterator();resultiter.hasNext();)

{

if(pairlist.get(resultiter.next()).contains(i))

second_check=true;

}

if(second_check==false)

{

found_one=true;

minroundnum=j;

j=0;

//second_check=false;

}

}

}

else

{

for(Iterator resultiter = resultlist.get(j).iterator();resultiter.hasNext();)

{

if(pairlist.get(resultiter.next()).contains(i))

second_check=true;

}

if(second_check==false)

{

found_one=true;

minroundnum=j;

j=0;

//second_check=false;

}

}

second_check=false;

}

}

if((minroundnum==maxrounds)&&(found_one==false))

{

++minroundnum;

++maxrounds;

}

else

{

found_one=false;

}

HashSet add2list=new HashSet ();

if(resultlist.containsKey(minroundnum))

{

add2list=resultlist.get(minroundnum);

add2list.add(i);

}

else

{

add2list.add(i);

}

resultlist.put(minroundnum,add2list);

System.out.print(" ");

System.out.print(minroundnum);

}

if((tc !=-1))

System.out.println();

}

}

catch(Exception e){System.out.println(e.toString());}

}}

我已经在像Ideone这样的在线评委上检查了这段代码,并且已经获得了预期的结果 . 但是当我提交此代码时,我会收到超出时间限制的错误 . 我已经在Ideone上使用足够大的输入集测试了这段代码,执行时间小于1秒 . 它似乎有一个错误或内存泄漏,似乎已经耗尽了我生命中的所有幸福 . 任何指针/提示将不胜感激 .

谢谢

EDIT1 -

感谢回复人员,我使用以下python脚本生成的输入运行代码 -

import random

filename="input.txt"

file=open(filename,'w')

file.write("50")

file.write("\n")

for i in range(0,50):

file.write("500 10000")

file.write("\n")

for j in range(0,10000):

file.write(str(random.randrange(1,501))+" "+str(random.randrange(1,501)))

file.write("\n")

file.close()

我的代码在上面脚本提供的输入上花费了大约71052毫秒 . 我现在必须把执行时间降到8000毫秒 . 我正在努力尝试替换rfeak建议的HashMaps和HashSets,我也想知道memoization在这种情况下是否会有所帮助 . 请指教 .

编辑2 - 使用数组重新编码我的算法似乎有效 . 只是,在不同的时间重新提交相同的代码给了我接受的解决方案和超出时间限制:D我有另一种方法来使用散列图来进一步优化 . 感谢帮助人员!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值