【问题标题】:What is wrong with my solution of SPOJ ACTIV?我的 SPOJ ACTIV 解决方案有什么问题?
【发布时间】:2017-06-06 10:42:24
【问题描述】:

这里是问题的链接: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);
    }

}
}

【问题讨论】:

    标签: java dynamic-programming


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多