
pascal编程:数字游戏
有这么一个游戏:写出一个1~N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个...
有这么一个游戏:写出一个1~N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置。下面是一个例子:
3 1 2 4
4 3 6
7 9
16
最后得到16这样一个数字。
现在想要倒着玩这样一个游戏,如果知道N,知道最后得到的数字的大小sum,请你求出最初序列a[i],为1~N的一个排列。若答案有多种可能,则输出字典序最小的那一个。
输入格式:1行,为两个正整数n,sum。输出格式:1行,为字典序最小的那个答案。
输入:4 16 输出:3 1 2 4
数据规模:对于40%的数据,n≤7;对于80%的数据,n≤10;对于100%的数据,n≤12,sum≤12345,且保证一定有解。 展开
3 1 2 4
4 3 6
7 9
16
最后得到16这样一个数字。
现在想要倒着玩这样一个游戏,如果知道N,知道最后得到的数字的大小sum,请你求出最初序列a[i],为1~N的一个排列。若答案有多种可能,则输出字典序最小的那一个。
输入格式:1行,为两个正整数n,sum。输出格式:1行,为字典序最小的那个答案。
输入:4 16 输出:3 1 2 4
数据规模:对于40%的数据,n≤7;对于80%的数据,n≤10;对于100%的数据,n≤12,sum≤12345,且保证一定有解。 展开
展开全部
不一定是最优,仅提供一种思路 !
var
a:array[1..15,1..15] of integer;
p,d,d0:array[1..15] of integer;
b:array[1..15] of boolean;
i,j,n:integer;
sum:integer;
find:boolean;
function s:integer;
var
i,j:integer;
begin
for j:=1 to n do a[1,j]:=d[j];
for i:=2 to n do
for j:=1 to n-i+1 do
a[i,j]:=a[i-1,j]+a[i-1,j+1];
s:=a[n,1];
end;
procedure pailie(x:integer);
var
m:integer;
begin
if x>n then begin
if s=sum then begin
for m:=1 to n do write(d[m]:3);
writeln;
find:=true;
end;
end else for m:=1 to n do
if (not b[m])and(not find) then begin
d0:=d;
d[x]:=p[m];
b[m]:=true;
pailie(x+1);
b[m]:=false;
d:=d0;
end;
end;
begin
n:=12;
sum:=13312;
find:=false;
for i:=1 to n do begin p[i]:=i; b[i]:=false; end;
pailie(1);
end.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询