循环实施

时间:2012-03-09 05:36:06

标签: c++ algorithm round-robin

计算机处理器有N个要执行的任务(1≤N≤50,000)。第i个任务需要Ti秒的处理时间(1≤Ti≤1,000,000,000)。处理器按如下方式运行任务:每个任务按顺序运行,从1到N,持续1秒,然后处理器从任务1开始重复此任务。一旦任务完成,它将不会在以后运行迭代。为每个任务确定任务完成后经过的总运行时间。 输入

输入的第一行包含整数N,接下来的N行包含整数T1到TN。 输出

输出N行,其中第i行包含一个整数,表示处理任务i所用的时间。

实施例

输入: 五 8 1 3 3 8

输出: 22 2 11 12 23

第二个任务在第一次迭代期间完成,完成2秒。在第三次迭代中,第三个和第四个任务分别在11秒和12秒完成。最后,在第八次迭代中,第一个和最后一个任务分别在22秒和23秒完成。

方法是什么?

这是我的代码:

#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n];
int total=0;
for(int i=0;i<n;i++)
{cin>>a[i];total+=a[i];}
int b[n];
int j=0;
for(int i=0;i<total;i++)
{
        while(a[j%n]==0) j++;
        a[j%n]-=1;
        if(a[j%n]==0) b[j%n]=i+1; j++;
}
for(int i=0;i<n;i++)
cout<<b[i]<<endl;
system("pause");
return 0;
}    

但这并没有被骗子接受......

2 个答案:

答案 0 :(得分:2)

首先你应该理解SPOJ或任何g ++编译器中C / C ++中的int限制是2 ^ 31,这是10 ^ 9,所以添加50,000次10 ^ 9会使它大约5 * 10 ^ 13,这是你的总变量无法容纳的。

即使上述问题得到纠正,您的程序也不会在任何可行的时间内运行。即使是最新的处理器也只能处理每秒10 ^ 9个指令的常数。但是你的程序可能需要更多的时间才能完成执行。 (我不能确切地说它需要花多少时间,但是为了给出一个近似的想法,在最坏的情况下,它肯定需要超过50,000秒,这几乎是13个小时)

每当您提交SPOJ中任何问题的解决方案时,您都要记住这些限制。

答案 1 :(得分:2)

首先,正如Chakradar Raju所说,模仿整个程序并不是一个很好的方法来实现其范围广泛的工作。并且你需要使用范围比int宽的类型,例如像long long那样的64bit int。

然后尝试找到一个好的算法来解决它。我将提供一种方法,并祝愿它有效。

每次,我们都会考虑一个编号为i的任务,当涉及到第i个任务的最后一秒时,所有任务都比它完成的要短。我们只需要将它们的成本加起来。对于不短于任务的任务,我们假设第i个任务需要Ti秒。不短于它的任务和第i个任务本身都适用于(Ti - 1)秒,并且对于它们自己的(Ti)处理,只有第i个任务之前的任务有效。总结一下,你就会得到答案。

以示例为例:

对于第一个任务,它需要8秒,而任务比它短1 + 3 + 3 = 7秒,那么它和第5个任务需要7秒,所以值为7 * 2 = 14秒。然后在第i个任务之前没有任务,所以我们只需要为第一个任务本身添加1秒。结果是7 + 14 + 1 = 22

也许它不够清楚,让我们看看第3个任务,需要3秒,只有1个任务比它短(第二个任务需要1秒)。所有剩下的任务都需要3 - 1 = 2秒,它是4 * 2 = 8秒。最后,在它之前只剩下一个任务,所以只有第三次运行。我们添加它和第三次处理本身。结果是1 + 8 + 1 + 1 = 11秒。

编码时,您需要记住任务的序列号,并按照处理时间对它们进行排序。然后,所有与他们短暂的任务都在它之前。左侧作业是线性时间处理,排序需要O(nlogn)时间复杂度,这足以完成作业。

相关问题