【问题标题】:getting WA when I try to submit mkbudget spoj当我尝试提交 mkbudget spoj 时得到 WA
【发布时间】:2012-03-22 03:48:27
【问题描述】:

我无法理解/想到我的代码无法提供正确输出的情况。 问题链接:http://www.spoj.pl/problems/MKBUDGET/

这个问题显然有一个 DP 解决方案。我在下面发布我的解决方案:

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<vector <int> > opt;

void compute_opt(vector<int> A,int n,int hire,int fire,int sal,int max_a)
{
    for(int i = A[0]; i <= max_a; i++)  //for num workers in 1st month
        opt[0][i] = i*(hire + sal);

    for(int i = 1; i < n; i++)  //num of months
        for(int j = A[i]; j <= max_a; j++)  //num of workers for ith month >=A[i] and <= max_a
            {
                opt[i][j] = opt[i-1][A[i-1]] + j*sal + (A[i] > A[i-1] ? (A[i]-A[i-1])*hire : (A[i-1] - A[i])*fire);

                for(int k = A[i-1]; k <= max_a; k++)
                    opt[i][j] = min(opt[i][j], opt[i-1][k] + j*sal + (j>k ? (j-k)*hire : (k-j)*fire));
            }   
}

int ans(vector<int> A, int n, int max_a)
{
    int ret = opt[n-1][A[n-1]];
    for(int i = A[n-1]; i <= max_a; i++)
        ret = min (ret, opt[n-1][i]);

    return ret; 
}

int main()
{
    vector<int> A;
    int n, hire, fire, sal,max_a, c = 1;
    while(1)
    {
        cin >> n;
        if(n == 0)
            break;

        A.clear();
        opt.clear();
        max_a = 0;
        cin >> hire >> sal >> fire;
        A.resize(n);
        for(int i = 0; i < n; i++)  
            {cin >> A[i];
             max_a = max(max_a,A[i]);
             }

        opt.resize(n);  
        for(int i = 0; i < n; i++)
            opt[i].resize(max_a + 2);

        compute_opt(A,n,hire,fire,sal,max_a);
        cout << "Case " << c << ", cost = $" << ans(A,n,max_a) << endl;
        c++;
    }
    return 0;
}

我得到了两个示例测试用例的正确答案,但我在提交时得到了一个 WA。有什么帮助吗?

【问题讨论】:

    标签: c++ algorithm dynamic-programming


    【解决方案1】:

    好的,所以您的问题是您不允许雇用介于 A[i] 和 A[i - 1] 之间的任意数量的员工的情况。也许解雇一些不需要的员工是个好主意,但不是全部。这就是你得到WA的原因。我修改了您的代码并被接受:

    void compute_opt(vector<int> A,int n,int hire,int fire,int sal,int max_a)
    {
        // Fill all disallowed entries with infinity
        for (int i = 0; i < A[0]; ++i)
            opt[0][i] = 1000000000;
        for(int i = A[0]; i <= max_a; i++)  //for num workers in 1st month
            opt[0][i] = i*(hire + sal);
    
        for(int i = 1; i < n; i++)
            for(int j = 0; j <= max_a; j++)
                {
                    // No need for special case handling,
                    //just check all previous numbers of employees
                    opt[i][j] = 1000000000;
                    if (A[i] > j) continue;
                    for(int k = 0; k <= max_a; k++)
                        opt[i][j] = min(opt[i][j],
                           opt[i-1][k] + j*sal + (j>k ? (j-k)*hire : (k-j)*fire));
                }   
    }
    

    顺便说一句,有一个比你有的解决方案更“贪婪”的解决方案,它不依赖于员工数量少(以便可以分配桌子)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-04
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      相关资源
      最近更新 更多