当我试图提交mkbudge-spoj时获得WA
getting WA when I try to submit mkbudget spoj
我无法理解/想到我的代码无法给出正确输出的情况。问题链接: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。有什么帮助吗?
好的,所以你的问题是你不允许雇佣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));
}
}
顺便说一句,有一种比现有解决方案更"贪婪"的解决方案,它不依赖于员工人数少(这样就可以分配表)。
相关文章:
- 为什么我在代码厨师的 CMPRSS 问题中得到 WA(错误答案)?
- SPOJ 上的主生成器 PRIME1
- SPOJ中的运行时错误
- 代码在代码块上运行良好,但在 SPOJ 上无法运行
- 对于 spoj 的问题 TRT(对待奶牛)的 dp 的最佳方法是什么?
- 当我的代码工作正常时,为什么在SPOJ中遇到运行时(Sigabrt)错误
- TLE试图使用Dinic算法在SPOJ上求解Fastflow
- 我已经通过了该问题的所有测试用例,甚至是Udebugg上的所有测试用例,并且仍然在UVA在线法官上获得了WA裁决
- 带地图的解决方案给了空调,unordered_map的解决方案给了WA.为什么
- 如何提高主生成器 (SPOJ) 解决方案的效率
- 为什么我在SPOJ上为Buglife获得WA
- SPOJ 问题 ADDREV - 添加反转数字(考虑到我的代码,我得到了一个错误的答案,这很荒谬......
- BFS 方法中的 TLE for SPOJ AKBAR
- 在 spoj AP2 上弄错了
- 我在spoj-lastdig2中使用我的代码 - 重新访问的最后一位数字
- Spoj :ENIGMATH - PLAY WITH MATH
- SPOJ GSS1 WA - Segment tree
- 当我试图提交mkbudge-spoj时获得WA
- Getting WA for SPOJ smpseq
- 在SPOJ INCSEQ -递增子序列中获取WA