132 条题解
-
0jiaoyunhao LV 10 @ 2010-07-16 19:35:19
var
f,g:array[1..10001] of integer;n,m,i,j,k,tt,p,q,c:integer;
procedure arraya;
begin
for p:=1 to n-i-1 do
for q:=p+1 to n-i do
if g[p]>g[q] then
begin
k:=g[p];
g[p]:=g[q];
g[q]:=k;
end;
end;begin
readln(n);
readln(m);
for i:=1 to n do read(f[i]);
tt:=m;
while tt>0 do
begin
for i:=n downto 1 do
if f[i] -
02010-03-26 20:52:52@
program rq022;
var
a:array[1..10000] of longint;
flag:array[1..10000] of boolean;
n,k,i:longint;
procedure qpl(changdu:longint);
var
i,j,k,c:longint;
begin
fillchar(flag,sizeof(flag),false);
for i:=changdu downto 1 do
begin
flag[a[i]]:=true;
if a[i]a[i]) and (flag[j]) then
begin
a[i]:=j;
flag[a[i]]:=false;
break;
end;
//for j:=i+1 to changdu do
j:=i+1;
for k:=1 to changdu do
if flag[k] then
begin
a[j]:=k;
flag[k]:=false;
j:=j+1;
end;
break;
end;
end;
end;
begin
fillchar(a,sizeof(a),0);
readln(n);
readln(k);
for i:=1 to n do
read(a[i]);
readln;
for i:=1 to k do
qpl(n);
for i:=1 to n-1 do
write(a[i],' ');
writeln(a[n]);
readln;
end. -
02009-11-13 17:12:56@
水题,秒杀
var
n,k,i,o:longint;
a:array[1..10000] of longint;procedure px(l,r:longint);
var i,j,m,t:longint;
begin
i:=l;j:=r;m:=a[(l+r) div 2];
repeat
while a[i]m do dec(j);
if ij;
if l -
02009-11-04 22:24:47@
蓦然回首,发现自己是个沙茶....
只知道用排列组合...但是组合数学时间够么所以,膜拜神牛们的题解
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02009-10-28 22:35:27@
program p1115;
var
m,k:byte;
n,x,y,i,j:integer;
a:array[1..10000] of integer;
begin
readln(n);
readln(m);
for i:=1 to n do read(a[i]);
for k:=1 to m do
begin
x:=n-1;
while a[x]>a[x+1] do dec(x);
y:=n;
while a[y]a[j] then
begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
end;
end;
for i:=1 to n-1 do write(a[i],' ');
writeln(a[n]);
end. -
02009-10-27 15:07:34@
全排列的生成字典序法
字典序法中,对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。
字典序算法如下:
设P是1~n的一个全排列:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn
1)从排列的右端开始,找出第一个比右边数字小的数字的序号j(j从左端开始计算),即 j=max{i|pipj}(右边的数从右至左是递增的,因此k是所有大于pj的数字中序号最大者)
3)对换pi,pk
4)再将pj+1......pk-1pkpk+1pn倒转得到排列p'=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,这就是排列p的下一个下一个排列。例如839647521是数字1~9的一个排列。从它生成下一个排列的步骤如下:
自右至左找出排列中第一个比右边数字小的数字4 839647521
在该数字后的数字中找出比4大的数中最小的一个5 839647521
将5与4交换 839657421
将7421倒转 839651247
所以839647521的下一个排列是839651247。编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msprogram ex;
var i,j,n,k:longint;
a:array[1..10000]of longint;procedure main;
var i,j,p,temp:longint;
begin
for p:=1 to k do
begin
i:=n-1;
while a[i]>a do dec(i);
j:=n;
while a[j] -
02009-10-23 20:52:18@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms全排列:
j:=n;
while(a[j-1]>a[j])do j:=j-1;
k:=n;
while(a[j-1]>a[k])do k:=k-1;
swap(a[j-1],a[k]);
for p:=j to n-1 do
for q:=p+1 to n do
if a[p]>a[q] then
swap(a[p],a[q]); -
02009-11-06 12:33:59@
-
02009-10-19 12:45:42@
编译通过...
├ 测试数据 01:运行超时|格式错误...
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
...为什么???
-
02009-10-14 22:32:03@
字典序生成全排列!
-
02009-10-14 16:01:46@
谁让我是菜鸟呢...字典序生成全排列就是不会...没招啊,就得模拟了...
定义新运算 原理上其实可以考虑用“个”为基本单位. -
02009-09-19 10:39:58@
var n,m,i:longint;
a:array[1..10000] of integer;procedure kuai(l,r:longint);
var i,j,x,y:longint;
begin
i:=l;j:=r;
x:=a[(l+r) div 2];
repeat
while a[i]x do dec(j);
if ij;
if ia[k] do inc(h);
y:=a[h];a[h]:=a[k];a[k]:=y;
if n-k>=2 then kuai(k+1,n);
end;begin
read(n,m);
for i:=1 to n do read(a[i]);
for i:=1 to m do chazhao;
for i:=1 to n do write(a[i],' ');end.
-
02009-09-13 16:05:17@
又学到了东西: 字典序生成全排列
-
02009-09-06 19:57:58@
惭愧了。本人没有用字典序生成全排列。关键是不懂。直接用模拟也可以了。
题目其实是模拟一个新运算,关键在于对定义的理解。笔者第一次构造算法的时候,想按位来加数,第一次提交才20分。然后发现通过构造按位加法有缺陷,对于无法再进位的情况不能得出正解。于是将按位加改为按个加。即每次+1。所以只要构造出每次+1的算法,注意进位就可以了。再说白了,就是生成全排列。
方法:
每次在右边找离本身差值最小且大于本身的数,与之调换,对剩下的进行排序。遇到饱和情况,尝试进位。 -
02009-08-25 23:30:04@
又学到了新东西,orz大牛们
-
02009-08-16 19:37:12@
var t,h,n,m,k,i,j,u:integer;
a:array[0..10000] of integer;
begin
readln(n);
readln(m);
for i:=1 to n do
read(a[i]);
for i:=1 to m do
begin
for j:=n-1 downto 1 do
if a[j]a then
begin
h:=a[k];
a[k]:=a;
a:=h;
break;
end;for t:=1 to (n-u) div 2 do
begin
h:=a[n-t+1];
a[n-t+1]:=a;
a:=h;
end;
end;
for i:=1 to n-1 do
write(a[i],' ');
writeln(a[n]);
end. -
02009-08-15 11:31:46@
字典序法生成全排列
-
02009-08-10 21:23:23@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02009-08-10 09:31:18@
字典序法生成全排列!!!!!
-
02009-08-07 13:37:16@
秀程序..第一个C程序嘿嘿
#include
#define MAXN 10001int a[MAXN],n,m;
void swap(int *a,int *b)
{
int k;
k=*a; *a=*b; *b=k;
}void process()
{
int i,j,k;
k=a[0];
for (i=1; (ik); i++)
k=a[i];
for (j=0; (j=0; i--)
scanf("%d",&a[i]);
for (i=0; i=0; i--)
printf("%d ",a[i]);
printf("\n");
return 0;
}