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

Codeforces 607A。得到错误答案

徐佐
2023-03-14

在一条数字线上有n个位于不同位置的信标。第i个信标具有位置Ai和功率电平Bi。当第i个信标被激活时,它摧毁其左侧(坐标递减方向)距离bi(含)内的所有信标。然而,信标本身并没有被摧毁。埼玉县将从右至左一个一个地启动信标。如果一个信标被破坏,它就不能被激活。
埼玉希望Genos在所有现有信标的右边严格地添加一个信标,具有任何位置和任何功率等级,这样尽可能少的信标被破坏。注意,Genos放置的信标意味着它将是第一个被激活的信标。帮助Genos找到最小数量的信标可以被摧毁。

这里是问题的链接(http://codeforces.com/contest/607/problem/a)。
我的方法是使用Dp找到最小数量的未销毁的对象。DP[i]=如果我只有i个元素,则未销毁的对象的最小数目。
-让inc是当第i个对象被位于右侧的某个元素销毁时的答案。因此inc=1+DP[i-1]

-让exc是当第i个对象未被位于右侧的某个元素销毁时的答案。由于第i个元素没有被摧毁,当我们将其引爆时,它将摧毁其左限范围内的所有元素(A[i]-B[i])。假设它可以破坏左侧的lbd个元素。因此exc=lbd+dp[i-lbd]

现在dp[i]=min{inc,exc}。最后返回dp[n]

但是我的代码在测试用例11中给出了错误的答案。如果我的逻辑或代码有问题,谁能帮助我吗?
这是我的代码片段
ll=long long int
pll=pair of long int
rep(i,0,n)=从0到n的循环

void solve(){
    ll n;
    cin>>n;
    vector<pll> a(n);
    vector<ll> b(n);
    rep(i,0,n){
        cin>>a[i].first>>a[i].second;
        b[i]=a[i].first;
    }
    sort(b.begin(),b.end());
    sort(a.begin(),a.end(),cmp);
    vector<ll> dp(n+1,0);
    rep(i,1,n+1){
        ll inc = 1+ dp[i-1];
        ll temp = a[i-1].first-a[i-1].second;
        ll lb = lower_bound(b.begin(),b.end(),temp)-b.begin();
        ll exc=(i-lb-1)+dp[lb];
        dp[i]=min(inc,exc);
    }
    cout<<dp[n]<<endl;
}


完整代码链接https://ideone.com/thbclk

共有1个答案

封梓
2023-03-14

这就是您如何定义DP[i]:

dp[i]=如果我只有i个元素,则未销毁的对象的最小数量。

首先,我认为这是一个错别字,你的意思是:

// dp[i] ... The number of beacons destroyed after lighting the i-th beacon

当我们点亮第I个灯塔:

  1. 它会摧毁其功率范围内的所有信标。
  2. 某些信标可能在此之前已经被破坏,未受第i个信标的影响。

合并%1。和2。我们得到dp[i]的以下表达式:

// lb = Lower Bound - the index of the left-most beacon
// that is still in the power range of the i-th beacon
dp[i] = lb == 0 ? i : i - lb + dp[lb-1];
ll ans = n - 1;
rep(i, 0, n) {
    ans = min(dp[i] + n - i - 1, ans);
}
// dp[i] ... The number of beacons lit after lighting the i-th beacon

当我们点亮第i个灯塔时,可能会发生两件事之一:

  1. 第i个信标是如此强大,它杀死了它左边的所有信标,使它成为唯一被点亮的信标
  2. 第i个信标只会击倒其左侧的一些信标

合并%1。和2。我们得到dp[i]的以下表达式:

// lb = Lower Bound - the index of the first beacon left of the
// i-th beacon that is out of the power range of the i-th beacon
dp[i] = lb < 0 ? 1 : 1 + dp[lb];
// minimum_number_of_beacons_destroyed = n - maximum_number_of_beacons_lit
    null
 类似资料:
  • 我用vscode写了一个java程序。但是我在java输出中得到了意想不到的答案。通常这个sout应该是6.6,但是java说6.6000000000000005。为什么

  • 这是我的代码。它正在传递问题语句中给出的测试用例。问题链接:http://www.spoj.com/problems/ACPC10D/tri[i][j]存储从tri[0][1]到达索引(i, j)的最小值。

  • 问题内容: 我有一个SQL视图,它产生一个包含8列的响应。这是一个相当复杂的工作,因此我不会在这里列出它,也不会增加我要理解的问题。 当我直接使用此查询在SQL Manager中查询视图时 我得到了预期的结果(前两行很重要),并且ProductNameId列在结果中排​​在第七位 当我对视图执行以下LINQ时 我实际上得到的是: 如您所见,前两个条目相同,并且ID的区别(32575和32576)已

  • 下面是SPOJ的一个归档问题。示例测试用例通过了,但我在提交时得到了W/A。我缺少一些测试用例(testCase)。需要帮助来找出我错过了什么案例和/或我做错了什么。 瓢虫艾达正在和她的朋友维尼特玩除数游戏。这个游戏有以下规则。他们之间有一堆石头。移动中的玩家可以选择至少1块,最多σ(N)块石头(其中σ(N)代表N的除数)。显然,N在每次移动后都会发生变化。得不到任何石头(N==0)的人输了。 因

  • 我将ElasticSearch-5.2.1与springboot一起使用,并在ElasticSearch中获得以下错误。球棒 JAVAlang.IllegalStateException:从不受支持的版本[2.0.0]收到的消息最小兼容版本为:[5.0.0] 在我的应用程序控制台中,出现以下错误: 原因:org。弹性搜索。客户运输NoNoNodeAvailableException:没有配置的节点