切换到宽版
  • 10807阅读
  • 8回复

急!Somebody help!在“拓扑排序”专题中发现的一道题~至今没有想到怎么去DO~请各位大虾赐教!!! [复制链接]

上一主题 下一主题
离线r134a
 
只看楼主 倒序阅读 0 发表于: 2006-08-28
寻找一列数,其中任意连续P项之和为正,任意Q项之和为负,若不存在则输出NO。


谁有办法???   求教!!!
[ 此贴被r134a在2006-08-28 23:50重新编辑 ]
.


祝大家明年NOIP大获全盛!


.
离线archimedes

只看该作者 1 发表于: 2006-08-29
??????? don't understand.
离线郁闷的猪
只看该作者 2 发表于: 2006-09-03
把原文贴出来
离线r134a
只看该作者 3 发表于: 2006-09-04
原文 = 寻找一列数,其中任意连续P项之和为正,任意Q项之和为负,若不存在则输出NO。
.


祝大家明年NOIP大获全盛!


.
离线swj05652
只看该作者 4 发表于: 2006-09-15
LZ这一专题是哪儿来的,给我看看?
离线dog_yj
只看该作者 5 发表于: 2006-10-01
容易..拓扑..构图..寻数..
离线wc_111191
只看该作者 6 发表于: 2007-12-10
这是npq问题,算法是拓扑排序
以下代码及注释均由本人完成,如有错误或欠佳之处,请发邮件给我:
wc_111191@sina.com
(楼下提供测试数据)
——————————————————————————————————————
{npq问题(拓扑排序)}

Program npq;
Const
  inf = 'npq.in';
  ouf = 'npq.out';  //定义输入输出文件

Type
  Node = ^Rec;
  Rec = Record
          Info: Integer;
          Next: Node;
        End;  //定义链表结构

Var
  map: Array[0..100]Of Node;  //邻接表
  le, rd, a, b: Array[0..100]Of Integer; 
{le存储邻接表数组中每个链表的长度,即当前结点出度的个数,
rd存储当前节点入度的个数,a存放拓扑排序的结果,b表示从
0~第i个数的部分和}
  n, p, q, i, count, now, sum, j: Integer; 
//count表示入度为0的结点的个数,sum是已经完成多少个结点
//now表示当前正在进行拓扑排序的入度为零的结点的序号

Procedure No;
Begin
  WriteLn('No');
  Close(Input);
  Close(Output);
  Halt;
End;  //如果无解,则输出'NO'

Procedure Inse(i, j: Integer);  //此过程是将i点连向j点
Var
  k, Temp: Node;  //k是待修改的元素,temp是活动在链表中的指针
  l: Integer;
Begin
  New(k);
  k^.Info := j;
  Temp := Map;
  Inc(le);
  Inc(rd[j]);
  For l:=1 To le Do Begin
    If l = le Then Temp^ := k^
    Else Begin
      If l = le - 1 Then New(Temp^.next);
      Temp := Temp^.Next;
    End;
  End;
End;

Procedure KillNode(i: Integer); //删除结点和与之相连的边
Var
  j: Integer;
  Temp: Node;
Begin
  If (le = 0)And(Sum <> n) Then No;
  Inc(sum);
  Temp := Map;
  For j:=1 To le Do Begin
    Dec(rd[Temp^.Info]);
    Temp := Temp^.Next;
  End;  //减小与之相连的边的入度个数
  rd := -1;  //为了避免被误判为入度为零
  Map := Nil;  //删除对应的链表
  a[sum] := i;  //记录结果
  le := 0;  //出度为0
End;

Begin
  Assign(Input, inf);
  Assign(Output, ouf);
  Reset(Input);
  Rewrite(Output);  //打开文件

  ReadLn(n, p, q);  //输入n, p, q

  For i:=0 To n Do New(Map);  //新建指针

  For i:=n Downto q Do
    Inse(i, i - q);  //在k和k-q之间画有向弧

  For i:=0 To n - p Do
    Inse(i, i + p);  //在k和k+q之间画有向弧

  For i:=0 To n Do Begin
    Count := 0;
    For j:=0 To n Do
      If rd[j] = 0 Then Begin
        Inc(Count);
        Now := j;
      End;
    If Count <> 1 Then No;
    KillNode(Now);
  End;  //拓扑排序

  For i:=1 To n + 1 Do
    b[a] := i - 1;  //根据结果创建b数组

  For i:=1 To n Do
    Write(b - b[i - 1], ' '); //根据部分和输出结果
  WriteLn;

  Close(Input);
  Close(Output);  //关闭文件
End.
[ 此贴被wc_111191在2007-12-10 22:55重新编辑 ]
离线wc_111191
只看该作者 7 发表于: 2007-12-10
n为数列长度,p是连续之和为正的个数,q是连续之和为负的个数

由于太长,这里只贴出0~10之间的有解数列:
(附件为0~50之间所有有解的数列)

n:3 p:2 q:3
-2 3 -2
n:3 p:3 q:2
2 -3 2
n:5 p:2 q:5
-3 4 -3 4 -3
n:5 p:3 q:4
-2 -2 5 -2 -2
n:5 p:4 q:3
2 2 -5 2 2
n:5 p:5 q:2
3 -4 3 -4 3
n:6 p:3 q:5
3 -5 3 3 -5 3
n:6 p:5 q:3
-3 5 -3 -3 5 -3
n:7 p:2 q:7
-4 5 -4 5 -4 5 -4
n:7 p:4 q:5
-2 -2 -2 7 -2 -2 -2
n:7 p:5 q:4
2 2 2 -7 2 2 2
n:7 p:7 q:2
4 -5 4 -5 4 -5 4
n:8 p:3 q:7
-3 -3 7 -3 -3 7 -3 -3
n:8 p:7 q:3
3 3 -7 3 3 -7 3 3
n:9 p:2 q:9
-5 6 -5 6 -5 6 -5 6 -5
n:9 p:3 q:8
4 -7 4 4 -7 4 4 -7 4
n:9 p:4 q:7
3 3 -8 3 3 3 -8 3 3
n:9 p:5 q:6
-2 -2 -2 -2 9 -2 -2 -2 -2
n:9 p:6 q:5
2 2 2 2 -9 2 2 2 2
n:9 p:7 q:4
-3 -3 8 -3 -3 -3 8 -3 -3
n:9 p:8 q:3
-4 7 -4 -4 7 -4 -4 7 -4
n:9 p:9 q:2
5 -6 5 -6 5 -6 5 -6 5
n:10 p:5 q:7
5 -7 5 -7 5 5 -7 5 -7 5
n:10 p:7 q:5
-5 7 -5 7 -5 -5 7 -5 7 -5
附件: npqtest.rar (8 K) 下载次数:52
离线皓清风月
只看该作者 8 发表于: 2011-07-24
支持你加分
快速回复
限100 字节
 
上一个 下一个