Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
这个算法为什么WA?先转换二进制 找到第一个满足其后至少有一个1的0,然后将这个0改成1,接着把剩下的数按照0在前1在后的顺序覆盖在原来的数上 以样例为例 78转换成1001110 1001110找到左数第三位的0(最后一位的0右面没有1),这个0及它右面的数字中共有2个0和3个1 将这个0改成1(变成1011110) 这时剩下2个0和2个1(用了一个1) 再按照0011的顺序覆盖最后四位(变成1010011) 如果是1000这样的数就当作01000处理,结果是10000 附程序: { Problem: An Easy Problem Writer: sqybi Date: 2007-01-06 Result: Unknown } Program pku2453; Var n, l, i, j, k1, k0, k: Longint; a: Array[1..200]Of Longint; Begin ReadLn(n); While n <> 0 Do Begin l := 0; FillChar(a, SizeOf(a), 0); While n <> 0 Do Begin Inc(l); a[l] := n Mod 2; n := n Shr 1; End; Inc(l); k1 := 0; k0 := 0; For i:=1 To l Do Begin If a[i] = 1 Then Inc(k1) Else Inc(k0); If (a[i] = 0) And (k1 <> 0) Then Begin a[i] := 1; Dec(k1); For j:=1 To k1 Do a[j] := 1; For j:=k1+1 To k1+k0 Do a[j] := 0; Break; End; End; k := 1; For i:=1 To l Do Begin n := n + a[i] * k; k := k * 2; End; WriteLn(n); ReadLn(n); End; End. Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator