2017-06-06 47 views
1

这里是链接的问题:SPOJ - ACTIV我的解决方案SPOJ ACTIV有什么问题?

我想出了复发的问题为:

F(i) = 1+F(i+1)+F(next(activities[i].endtime)) 

其中next()的发现与起始时间> =端的活性的指标当前活动的时间,而活动按开始时间的升序排序。

这是我的java解决方案,虽然它通过了许多SPOJ工具包的测试用例,但它确实给了一些WA的测试用例。我的概念/解决方案有什么问题?

import java.util.*; 
import java.io.*; 
class Pair<T>{ 
    final T x; 
    final T y; 
    Pair(T a, T b){ 
     this.x = a; 
     this.y = b; 
    } 
} 

public class Activities{ 
    private static int search(Pair<Integer> []p,int key, int l, int h) 
    { 
     int ll=l; 
     while(l<h) 
     { 
      int mid = (l+h)/2; 
      if(p[mid].x < key)l=mid+1; 
      else if(p[mid].x == key){ 
       while(mid>=ll && p[mid].x == key)mid--; 
       return mid+1; 
      } 
      else h=mid; 
     } 
     if(l==h && l>=0 && p[l].x>=key)return l; 
     return -1; 
    } 
    public static void main(String[] args)throws IOException { 
     final long mod = 100000000; 
     BufferedReader buff = new BufferedReader(new InputStreamReader(System.in)); 
    while(true) 
    { 
     int n = Integer.parseInt(buff.readLine()); 
     if(n==-1)return; 
     Pair <Integer> p [] = new Pair[n]; 
     for(int i=0;i<n;i++){ 
      String [] in = buff.readLine().split(" "); 
      int x = Integer.parseInt(in[0]), y = Integer.parseInt(in[1]); 
      p[i] = new <Integer>Pair(x,y); 
     } 
     Arrays.sort(p, new Comparator<Pair<Integer>>(){ 
      public int compare(Pair<Integer> p1, Pair<Integer> p2){ 
       if(p1.x == p2.x)return p1.y - p2.y; 
       else return p1.x - p2.x; 
      } 
     }); 

     long dp[] = new long[n]; 
     dp[n-1] = 1; 
     for(int i=n-2;i>=0;i--) 
     { 
      int idx = search(p,p[i].y,i,n-1); 
      dp[i] = 1+dp[i+1]; 
      if(idx != -1)dp[i]=dp[i]+dp[idx]; 
     } 
     String res = (dp[0]%mod)+""; 
     while(res.length()<8)res = '0'+res; 
     System.out.println(res); 
    } 

} 
} 

回答

1

您的代码能够超出long类型的作用域。您应该更频繁地使用[0, mod)范围进行计算。这应该足以解决您的问题并解决此Spoj的问题:

for(int i=n-2;i>=0;i--) 
{ 
    int idx = search(p,p[i].y,i,n-1); 
    dp[i] = 1+dp[i+1]%mod; 
    if(idx != -1)dp[i]=(dp[i]%mod+dp[idx]%mod)%mod; 
} 
相关问题