数字序列

时间:2015-07-24 04:32:06

标签: math pascal prefix-sum

我有关于数字序列的作业。给出从 1 MAX n 元素数组。我们可以选择任何数字开始。我们可以将开始乘以2,或者将它除以2,但如果开始已经是奇数,我们就不能将其除以。任务是我们必须最小化阵列中每个数字的差异总和。

例如
arr [] = {2,4,7,32,16}输出为1,因为我们可以选择1作为 start 。对于每个元素,我们必须使这个数字更大,更接近元素。
我们遍历阵列。
对于n = 0;元素是2.所以我们将开始乘以2,1次 start = 2 ,所以差值为2-2 = 0;
对于n = 1;元素是4.所以我们将开始乘以2,1次 start = 4 ,所以差值为4-4 = 0;
对于n = 2;元素是7.所以我们将 start 乘以2,1次 start = 8 ,所以差值为8-7 = 1;
对于n = 3;元素是32.所以我们将开始乘以2,2次 start = 32 ,所以差值为32-32 = 0;
对于n = 4;元素为16.所以我们将开始除以2,1次 start = 16 ,因此差值为16-16 = 0; SO TOTAL DIFFERENCES = 0 + 0 + 1 + 0 = 1;

如果我们选择start = 3那么它就变成了
对于n = 1;元素是4.所以我们将开始乘以2,1次 start = 6 ,所以差值为6-4 = 2;
对于n = 2;元素是7.所以我们将开始乘以2,1次 start = 12 ,所以差值是12-7 = 5;
对于n = 3;元素是32.所以我们将开始乘以2,2次 start = 48 ,所以差值是48-32 = 16;
对于n = 4;元素是16.所以我们将开始除以2,1次开始= 24 ,因此差值为24-16 = 8; 总差异= 2 + 5 + 16 + 8 = 31;

我们可以看到,对于 start = 1 ,输出比所有数字最小,强制强制每个数字从 1 MAX

为了解决这个问题,我有了主意。

  
      
  1. 对于开始,我们选择从 1 MAX 的所有奇数。
  2.   
  3. 然后我强制所有可能的开始为每个元素获得最小值。
  4.   

这是PASCAL代码

uses math;
var
data:array[1..1000100] of longint;
s:string[7];
n,i,j,min,ansn,ansb,sub:longint;

function minimum(a,b:longint):longint;
begin
if a>b then
minimum:=b
else
minimum:=a;
end;

function hitung(a:longint):longint;
var
x,hit,ca,tot,b:longint;

begin
hit:=0;
tot:=0;
for x:=1 to n do begin
hit:=hit+data[x];

b:=a;

while b<data[x] do begin
b:=b*2;
end;

tot:=tot+b;
end;
hitung:=tot-hit;
end;

begin
readln(s);
readln(n);
sub:=1000000;
for i:= 1 to n do
read(data[i]);

ansb:=hitung(1);

j:=1;

while ((ansb>0) and (j<=sub)) do
begin
ansn:=hitung((2*(j))+1);
min:=minimum(ansb,ansn);
ansb:=min;
j:=j+1
end;

writeln(min);
end.

它适用于小 MAX ,但解决方案的提示表示该解决方案使用前缀和,O( MAX / 2)。虽然我的解决方案是O( MAX / 2 * N)。我不知道在哪里插入前缀sum。我们怎么做到这一点?提前谢谢!

0 个答案:

没有答案