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 |
Re:这个算法为什么WA?In Reply To:这个算法为什么WA? Posted by:sqybi at 2007-01-06 18:26:13 > 先转换二进制 > 找到第一个满足其后至少有一个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