如何在SPOJ上解决BAISED?

时间:2016-02-11 16:54:25

标签: algorithm greedy

我正在尝试解决此SPOJ问题http://www.spoj.com/problems/BAISED/

我的方法

for all elements in the preferred_position array
 if(position>0&&position<=n)
    if(position is unoccupied)
       allocate position for user
 else
   reach the first free position in the array

for all elements whose preferred position is already filled
    search both directions left,right to find nearest free_position

我尝试了很多测试用例并将它们弄好了,我不知道我在哪里失败并得到了错误的答案。我选择基于贪婪标签的这个问题,我真的不知道在哪里应用贪婪的技术。有人可以请点亮一点吗?

2 个答案:

答案 0 :(得分:2)

这是我接受的解决方案!!

我发送了几次,直到认识到数字可能非常大,所以我将所有内容都改为很长

只需对数字进行排序,然后找出其位置之间的差异。

我是如何达成这个解决方案的:

  

1)你应该把所有球队都安排在0到n - 1的位置

     

2)让尽可能多的球队放在他们喜欢的地方

     3)休息未被放置的球队拥有与放置相同的首选位置   球队或首选位置大于n - 1(或n - 如果   列举自1)

     

4)我们记得我们需要将所有位置从0降到n - 1,   所以很明显,如果我们对未放置的团队进行排序,我们可以最小化   答案

为什么我跳过第二步(您可以尝试对其进行校对),让我们看一下示例测试:

1
3
first team 2
second team 3
third team 4
4 2 3 -> |1 - 4| + |2 - 2| + |3 - 3| = 3
2 3 4 -> |1 - 2| + |2 - 3| + |3 - 4| = 3
    #include <iostream>
    #include <vector>
    #include <algorithm>

    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        long long t;
        cin >> t;
        vector <long long> a;
        for (long long i = 0; i < t; i++) {
           long long n;
           cin >> n;
            a.clear();
            for (long long j = 0; j < n; j++) {
                string s;
                cin >> s;
                long long p ;
                cin >> p;
                p--;
                a.push_back(p);
            }
            sort(a.begin(), a.end());
            long long ans = 0;
            for (long long i = 0; i < a.size(); i++) {

                ans += abs(a[i] - i);
            }
            cout << ans << '\n';
       }
    }

答案 1 :(得分:0)

  

我哪里错了?这是代码ideone.com/O4ood1

的链接

阅读你的代码非常痛苦..而且你的解决方案不正确100%,因为:

  1. 可能有超过10 ^ 10的非常大的数字,你做错了什么 - 它会减少这个数字直到你达到n,你的生命太短暂等待当你的解决方案找到测试结果时会有如此大的数字... 如果你想让[i]变得小于或等于n,为什么不写一个[i] = n

    while(t2>n)
        {
            t2--;
            cnt1++;
        }
    
  2. 我在同一个测试用例上运行了两次代码,但是在第二次 运行我在测试中更改给定数字的顺序,您的解决方案显示 答案不同:

    我删除了读取字符串以便于调试..所以我提供没有团队名称的测试

    首次参加测试:

    1

    10

    2 3 4 5 6 7 8 9 7 6

    您的解决方案显示结果 6 出了什么问题 回答

    第二次运行: 让最后两个数字更改掉掉并获得

    2 3 4 5 6 7 8 9 6 7

    您的解决方案显示答案 8 (幸运的是,它是 正确答案)

  3. 假设有两个未放置的数字 a [6] = 6 a [9] = 9 < / strong>下, 和 有两个免费地点 1和8

    您的解决方案将采用 6 两个步骤,将 6 置于 8 位置,然后取 9 并置于 1 位置。

    如果您从数字的开始位置绘制线条 目的地您会在 6 中看到从 9 1 完全封面的行 8 ...看起来不是最佳的。

    所以你应该尽量避免这种重叠

    现在从 6到1 9到8 中绘制线条,没有 重叠,现在是最佳的。

    So to avoid overlapping   you can for example to sort rest of your numbers.