当前位置: 首页 > 知识库问答 >
问题:

我的SPOJ活动解决方案有什么问题?

国高杰
2023-03-14

下面是问题的链接: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个答案

壤驷瑾瑜
2023-03-14

您的代码能够超出长的类型范围。您应该更频繁地对[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;
}
 类似资料:
  • 这是一个骇人听闻的问题:爱丽丝是一个幼儿园老师。她想给班上的孩子们一些糖果。所有的孩子坐成一行(他们的位置是固定的),每个人根据他(她)在班上的表现有一个评级分数。爱丽丝想给每个孩子至少一颗糖。如果两个孩子挨着坐,那么评分较高的那一个必须得到更多的糖果。爱丽丝想省钱,所以她需要尽量减少给孩子们的糖果总数。 测试数组:n=10,n个元素为[2 4 2 6 1 7 8 9 2 1]。我得到的答案是18

  • 从操作系统概念 5.8.2使用显示器的餐饮哲学家解决方案 接下来,我们通过对用餐哲学家问题提出一个无死锁的解决方案来说明监控概念。这个解决方案施加了一个限制,即哲学家只有在筷子都可用的情况下才能拿起筷子。为了给这个解决方案编码,我们需要区分我们可能找到哲学家的三种状态。为此,我们引入以下数据结构: 哲学家只有当她的两个邻居不吃饭时,我才能设置变量

  • 问题内容: 我知道N + 1问题是执行一个查询以获取N个记录,执行N个查询以获取一些关系记录。 但是如何在Hibernate中避免这种情况? 问题答案: 假设我们有一个制造商类,与Contact有多对一关系。 我们通过确保初始查询能够获取在适当的初始化状态下加载所需对象所需的所有数据来解决此问题。一种方法是使用HQL提取联接。我们使用HQL 与fetch语句。这导致内部联接: 使用条件查询,我们可

  • null 我正在用trie把字典里的所有单词都倒置起来。然后,为了解决这些查询,我按照以下方式进行:- 如果trie中有单词,请将其从trie中删除。 现在从根遍历trie,直到查询字符串中的字符与trie值匹配的点。让最后一个字符匹配的点为p。 现在从这一点P开始,我使用DFS遍历trie,在遇到叶节点时,将形成的字符串推送到可能的结果列表。 现在,我将从该列表返回词典中最小的结果。 当我在SP

  • 这是hackerrank(https://www.hackerrank.com/challenges/coin-change)的硬币更换问题。它要求计算使用给定面值的硬币对N进行更改的方法总数。 例如,有四种方法可以使用面额为1、2和3的硬币兑换4。它们是-

  • 本文向大家介绍移动端1px像素的问题及解决方案是什么?相关面试题,主要包含被问及移动端1px像素的问题及解决方案是什么?时的应答技巧和注意事项,需要的朋友参考一下 viewport结合rem解决像素比问题 比如在devicePixelRatio=2设置meta <meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5,