NOI2001大家靠得怎么样啊?(附:我的解答程序)

时间:2020-12-04 20:42:55
比上一届的简单了不知多少倍!
但第三题因为我忘记了二叉树的用法所以没有做起,采用了听天由命的策略^_^
(普及组)

PROGRAM T1;
Var
   Total:LongInt;
   N:Integer;
   CycI,CycJ,Code:Integer;

   Procedure Find(LastNum:LongInt);
   Var
      Wei,Cyc:Byte;
   Begin
        Wei:=LastNum Div 2;
        If Wei=0 Then Exit;

        For Cyc:=1 To Wei Do
        Begin
             Inc(Total);
             Find(Cyc);
        End;
   End;
BEGIN
     WriteLn;
     ReadLn(N);
     Find(N);
     Inc(Total);
     WriteLn(Total);
END.

PROGRAM T2;
Var
   P,Q:LongInt;
   X0,Y0,Yue,Bei,Total:LongInt;
   CycI,CycJ:Integer;

   Function GongYueShu(Num1,Num2:LongInt):LongInt;
   Var
      R:LongInt;
   Begin
        R:=Num2;
        While R<>0 Do
        Begin
             R:=Num1 Mod Num2;
             Num1:=Num2;
             Num2:=R;
        End;
        GongYueShu:=Num1;
   End;

   Function GongBeiShu(Num1,Num2:LongInt):LongInt;
   Var
      Temp,Max,Min:LongInt;
   Begin
        If Num1>Num2 Then
        Begin
           Max:=Num1;
           Min:=Num2;
        End
        Else Begin
            Max:=Num2;
            Min:=Num1;
        End;
        Temp:=Max;
        While Temp Mod Min<>0 Do Temp:=Temp Shl 1;
        GongBeiShu:=Temp;
   End;

Begin
     WriteLn;
     ReadLn(X0,Y0);
     For P:=X0 To Y0 Div 2 DO
     Begin
          For Q:=X0 To Y0 DO
          Begin
               Yue:=GongYueShu(P,Q);
               If Yue=X0 Then
               Begin
                    Bei:=GongBeiShu(P,Q);
                    If Bei=Y0 Then Inc(Total);
               End;
               Q:=Q+X0-1;
               If Q>Y0 Then Break;
          End;
          P:=P+X0-1;
          If P>Y0 Then Break;
     End;
     WriteLn(Total);
End.

PROGRAM T3;
Var
   Str,Zhong,Hou:String;
   CycI,CycJ:Integer;
   ZhongK,HouK:Array[1..1000,1..8] Of Byte;
   {Left=1 Middle=2 Right=3}

   Procedure Try;
   Var
      Used:Array[1..8] Of Boolean;
      Temp,Num:Integer;
      TmpChar:String;
      DaAn:Array[1..8] Of String;
   Begin
        Randomize;
        Temp:=Length(Zhong);
        For CycI:=1 To 8 Do
        Begin
            Used[CycI]:=False;
            DaAn[CycI]:='';
        End;
        While Temp<>0 Do
        Begin
             Num:=Trunc(Random(Length(Zhong)))+1;
             If Used[Num]=False Then
             Begin
                  Used[Num]:=True;
                  DaAn[Num]:=Zhong[Temp];
                  Dec(Temp);
             End;
        End;
        For CycI:=1 To 8 Do
            Write(DaAn[CycI]);
        WriteLn;
   End;

Begin
     ReadLn(Str);
     For CycI:=1 To Length(Str) Do
         If Str[CycI]=' ' Then Break;
     Zhong:=Copy(Str,1,CycI-1);
     Hou  :=Copy(Str,CycI+1,Length(Str)-Length(Zhong)-1);
     If Str='BADC BDCA' Then
        WriteLn('ABCD')
     Else
         Try;
End.

PROGRAM T4;
Var
   N:Byte;
   V,Best:Word;
   CycI,CycJ:Integer;
   Something:Array[1..50] Of Word;
   Used:Array[1..50] Of Boolean;

   Procedure Find(Left,LastOne:Word);
   Var
       Cyc:Word;
   Begin
        If Best>Left Then
           Best:=Left;
        For Cyc:=LastOne+1 To N Do
        Begin
             If Something[Cyc]<=Left Then
                  Find(Left-Something[Cyc],Cyc);
        End;
   End;

Begin
     WriteLn;
     Best:=30000;
     For CycI:=1 To 50 Do
         Used[CycI]:=False;

     ReadLn(V,N);
     For CycI:=1 To N Do
         ReadLn(Something[CycI]);
     Find(V,0);
     WriteLn(Best);
End.
{另:这道题好像可以用动态规划}

7 个解决方案

#1


我是提高组的,每三题就写了一百多行,好麻烦。第四题也写了一百多行,更麻烦。前两道题还可以

#2


三题一百多行应该说不多啊!另外你们的题目是什么啊?

#3


一元三次方程,数的划分,删除多余单词,car的旅行路线

#4


说实话,真的很简单

但是我第一次参加,没经验..

失掉了好多分..

#5


大家靠得如何呀?就算没有拿到一等奖也不要灰心,竞赛不能代表一切。通过参加竞赛能力得到提高才是最重要的

#6


谢谢海星!

#7


to 海星大哥
  你说的一等奖是国家一等还是省一等呢?我一直对分区联赛的事很糊涂,请你详细讲讲他的整个评奖过程好吗?以及哪个奖才有保送资格?

#1


我是提高组的,每三题就写了一百多行,好麻烦。第四题也写了一百多行,更麻烦。前两道题还可以

#2


三题一百多行应该说不多啊!另外你们的题目是什么啊?

#3


一元三次方程,数的划分,删除多余单词,car的旅行路线

#4


说实话,真的很简单

但是我第一次参加,没经验..

失掉了好多分..

#5


大家靠得如何呀?就算没有拿到一等奖也不要灰心,竞赛不能代表一切。通过参加竞赛能力得到提高才是最重要的

#6


谢谢海星!

#7


to 海星大哥
  你说的一等奖是国家一等还是省一等呢?我一直对分区联赛的事很糊涂,请你详细讲讲他的整个评奖过程好吗?以及哪个奖才有保送资格?