Section 2.1 Sorting A Three-Valued Sequence
2010-08-24 18:03
567 查看
用一个数组存原始数据, 一个数组存目标数据
再用一个记录数组 存1,2,3的开始数据与结束的位置
然后找可以一次匹配的, 通过一次交换使两个数都到目标位置的, ans + 1
找完以后再找 3个匹配的, 这需要2次交换 ans + 2
输出ans即可
{
ID: yaoyuan4
PROG: sort3
LANG: PASCAL
}
Program sort3;
type
date = record
op, ed : longint;
end;
const
maxn = 1000; inf = 'sort3.in'; outf = 'sort3.out';
var
n, ans : longint;
a, b : array[1..maxn] of longint;
fx : array[1..3] of longint;
f : array[1..3] of date;
Procedure swap(var a, b : longint);
var
t : longint;
begin
t := a;
a := b;
b := t;
end;
Procedure init;
var
i, j : longint;
begin
fillchar(fx, sizeof(fx), 0);
assign(input, inf); reset(input);
readln(n);
for i := 1 to n do
begin
readln(a[i]);
inc(fx[a[i]]);
end;
close(input);
f[1].op := 1; f[1].ed := fx[1];
f[2].op := f[1].ed + 1; f[2].ed := f[2].op + fx[2] - 1;
f[3].op := f[2].ed + 1; f[3].ed := n;
for i := 1 to 3 do
for j := f[i].op to f[i].ed do
b[j] := i;
end;
Procedure work;
var
i, j, k : longint;
begin
for i := 1 to n do
if a[i] <> b[i] then
for j := f[a[i]].op to f[a[i]].ed do
if b[i] = a[j] then
begin
swap(a[i], a[j]);
inc(ans);
break;
end;
for i := 1 to n do
if a[i] <> b[i] then
for j := f[a[i]].op to f[a[i]].ed do
for k := f[6-a[i]-b[i]].op to f[6-a[i]-b[i]].ed do
if (a[i] = b[j]) and (a[j] = b[k]) and (a[k] = b[i]) then
begin
a[i] := b[i]; a[j] := b[j]; a[k] := b[k];
inc(ans, 2);
end;
end;
Procedure print;
begin
assign(output, outf); rewrite(output);
writeln(ans);
close(output);
end;
begin
init;
work;
print;
end.
再用一个记录数组 存1,2,3的开始数据与结束的位置
然后找可以一次匹配的, 通过一次交换使两个数都到目标位置的, ans + 1
找完以后再找 3个匹配的, 这需要2次交换 ans + 2
输出ans即可
{
ID: yaoyuan4
PROG: sort3
LANG: PASCAL
}
Program sort3;
type
date = record
op, ed : longint;
end;
const
maxn = 1000; inf = 'sort3.in'; outf = 'sort3.out';
var
n, ans : longint;
a, b : array[1..maxn] of longint;
fx : array[1..3] of longint;
f : array[1..3] of date;
Procedure swap(var a, b : longint);
var
t : longint;
begin
t := a;
a := b;
b := t;
end;
Procedure init;
var
i, j : longint;
begin
fillchar(fx, sizeof(fx), 0);
assign(input, inf); reset(input);
readln(n);
for i := 1 to n do
begin
readln(a[i]);
inc(fx[a[i]]);
end;
close(input);
f[1].op := 1; f[1].ed := fx[1];
f[2].op := f[1].ed + 1; f[2].ed := f[2].op + fx[2] - 1;
f[3].op := f[2].ed + 1; f[3].ed := n;
for i := 1 to 3 do
for j := f[i].op to f[i].ed do
b[j] := i;
end;
Procedure work;
var
i, j, k : longint;
begin
for i := 1 to n do
if a[i] <> b[i] then
for j := f[a[i]].op to f[a[i]].ed do
if b[i] = a[j] then
begin
swap(a[i], a[j]);
inc(ans);
break;
end;
for i := 1 to n do
if a[i] <> b[i] then
for j := f[a[i]].op to f[a[i]].ed do
for k := f[6-a[i]-b[i]].op to f[6-a[i]-b[i]].ed do
if (a[i] = b[j]) and (a[j] = b[k]) and (a[k] = b[i]) then
begin
a[i] := b[i]; a[j] := b[j]; a[k] := b[k];
inc(ans, 2);
end;
end;
Procedure print;
begin
assign(output, outf); rewrite(output);
writeln(ans);
close(output);
end;
begin
init;
work;
print;
end.
相关文章推荐
- USACO-Section 2.1 Sorting a Three-Valued Sequence (贪心)
- USACO Section 2.1: Prob Sorting A Three-Valued Sequence
- USACO Section2.1 Sorting a Three-Valued Sequence 解题报告
- USACO-Section2.1 Sorting a Three-Valued Sequence [其他][排序][交换]
- USACO-Section2.1 Sorting a Three-Valued Sequence[排序]
- USACO-Section2.1 Sorting a Three-Valued Sequence(排序)
- USACO - Chapter2 Section 2.1 - Sorting a Three-Valued Sequence
- USACO-Section2.1 Sorting a Three-Valued Sequence【数学公式】
- [USACO2.1]三值的排序 Sorting a Three-Valued Sequence
- USACO section 2.1 Sorting a Three-Valued Sequence
- USACO 2.1 Sorting a Three-Valued Sequence (贪心)
- USACO [2.1] Sorting a Three-Valued Sequence
- USACO section 2.1 Sorting a Three-Valued Sequence
- USACO 2.1 Sorting A Three-Valued Sequence
- USACO Section 2.1 Sorting A Three_Valued Sequence - 应该有更好的方法
- USACO 2.1-Sorting a Three-Valued Sequence
- 【USACO 2.1】Sorting A Three-Valued Sequence
- USACO Section 2.1: Sorting a Three-Valued Sequence
- USACO2.1 三值的排序 Sorting a Three-Valued Sequence
- USACO Section 2.1 Sorting a Three-Valued Sequence