KeyFansClub

首页 » - 特色讨论区 - » 土豆星 » 论坛里有会PASCAL的吗?帮个忙
临终之梦 - 2008/7/16 9:44:00
program mouse;
  var
    a,d:array[1..1500,1..1500]of longint;
    b,c:array[1..1000]of longint;
    n,i,t,max,j,m,q:longint;
  begin
    readln(n);
    for i:=1 to n do
      read(b);
    readln;
    for i:=1 to n do
      read(c);
    {for i:=1 to n-1 do
      for j:=i+1 to n do
        if b>b[j] then
          begin
            t:=b;
            b:=b[j];
            b[j]:=t;
            t:=c;
            c:=c[j];
            c[j]:=t;
          end;}
    for i:=1 to n do
      begin
        a[b,c]:=c;
        d[b,c]:=d[b,c]+1;
      end;
    i:=0;
    while i<n do
      begin
        i:=i+1;
        t:=i;
        m:=0;
        for j:=100 downto 1 do
          if d[i,j]>=1 then
            begin
              q:=j;
              break;
            end;
          while t>0 do
            begin
              if d[i,j]>=1 then
                begin
                  m:=m+a[i,j];
                  t:=t-1;
                  d[i,j]:=d[i,j]-1;
                end
                else j:=j-1;
            end;
          if m>=(max+a[i,q])
            then max:=m
            else max:=max+a[i,q];
      end;
    writeln(max);
  end.

为啥会溢出?


PS:我承认这题本身做法就不一定对
PS2:这年头貌似PASCAL只有初中高中的竞赛用用了
粘土火星 - 2008/7/16 10:04:00
[strike]for j:=100 downto 1

这是啥?

PS:变量名好囧,等下仔细看看……[/strike]

试验了一下……根本编译不了=v=b

很好奇你怎么能出现over range的问题,TP只有too large,囧

你搞了2个longint大数组 1500*1500*4byte*2/1024=17578k,TP静态数据空间只有64k,怎么能装得下。。。

如果用的是FP或者DELPHI =  =,检查后面的语法错误吧,囧
临终之梦 - 2008/7/16 10:10:00
是 for j:=100 downto 1 do 的说
粘土火星 - 2008/7/16 10:38:00
什么题=v=?
临终之梦 - 2008/7/16 10:55:00
地鼠游戏(mouse.pas/in/out)
    王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不但学习刻苦,而且善于经常总结、完善自己的学习方法,所以他总能在每次考试中得到优异的分数,这一切很大程度上是由于他是一个追求效率的人。
    但王钢也是一个喜欢玩的人,平时在学校学习他努力克制自己玩,可在星期天他却会抽一定的时间让自己玩一下,他的爸爸妈妈也比较信任他的学习能力和学习习惯,所以在星期天也不会象其他家长一样对他抓紧,而是允许他在星期天上午可以自由支配时间。
    地鼠游戏是一项需要反应速度和敏捷判断力的游戏。游戏开始时,会在地板上一下子冒出很多地鼠来,然后等你用榔头去敲击这些地鼠,每个地鼠被敲击后,将会增加相应的游戏分值。问题是这些地鼠不会傻傻地等你去敲击,它总会在冒出一会时间后又钻到地板下面去(而且再也不上来),每个地鼠冒出后停留的时间可能是不同的,而且每个地鼠被敲击后增加的游戏分值也可能是不同,为了胜出,游戏参与者就必须根据每个地鼠的特性,有选择地尽快敲击一些地鼠,使得总的得分最大。
这个极具挑战性的游戏王钢特别喜欢,最近他经常在星期天上午玩这个游戏,慢慢地他不但敲击速度越来越快(敲击每个地鼠所需要的耗时是1秒),而且他还发现了游戏的一些特征,那就是每次游戏重新开始后,某个地鼠冒出来后停留的时间都是固定的,而且他记录了每个地鼠被敲击后将会增加的分值。于是,他在每次游戏开始后总能有次序地选择敲击不同的地鼠,保证每次得到最大的总分值。
输入输出要求:
    输入文件mouse.in包含3行,第一行包含一个整数n(1<=n<=100)表示有n个地鼠从地上冒出来,第二行n个用空格分隔的整数表示每个地鼠冒出后停留的时间,第三行n个用空格分隔的整数表示每个地鼠被敲击后会增加的分值(<=100)。每行中第i个数都表示第i个地鼠的信息。
    输出文件mouse.out只有一行一个整数,表示王钢所能获得的最大游戏总分值。
样例:
mouse.in
5
5  3  6  1  4
7  9  2  1  5
mouse.out
24



你直接给我标程也可以-_-b
Prz - 2008/7/16 11:22:00
er... 楼主最好养成好习惯,用稍微有说明性的变量名。多敲两个字用不了多少时间,而且会降低差错的时间,特别是让别人帮你找错的时候(竞赛里面不少这种情况,俗话说不识庐山真面目...)。

存取一个数组的元素要加索引的吧,光 b c 没有意义...
d[b,c]:=d[b,c]+1; <--- 数据都没有初始化,没有意义+1还是等于没有意义
临终之梦 - 2008/7/16 11:29:00
原帖由 Prz 于 2008-7-16 11:22:00 发表
没有意义+1还是等于没有意义


这话好经典-_-b
Prz - 2008/7/16 11:30:00
嗯,另外,顶楼的算法好像是一种贪婪算法,那么应该是错的。
这道题不能用贪婪算法。
临终之梦 - 2008/7/16 11:31:00
原帖由 粘土火星 于 2008-7-16 10:04:00 发表
[strike]for j:=100 downto 1

这是啥?

PS:变量名好囧,等下仔细看看……[/strike]

试验了一下……根本编译不了=v=b

很好奇你怎么能出现over range的问题,TP只有too large,囧

你搞了2个longint大数组 1500*1500*4byte*2/1024=17578k,TP静态数据空间只有64k,怎么能装得下。


我用的FP,试着把longint改成integer了,还是不行
话说我原来开的是两个100*100的数组的说
临终之梦 - 2008/7/16 11:32:00
原帖由 Prz 于 2008-7-16 11:30:00 发表
嗯,另外,顶楼的算法好像是一种贪婪算法,那么应该是错的。
这道题不能用贪婪算法。


所以我一开始就没说这算法是对的啊-_-b
只是想知道那里出问题了
Prz - 2008/7/16 11:39:00
算法错误,就算改掉了实现的错误,还是没有用处啊....

我看多半在没有初始化数据上,太多的东西都没有初始化||||||||||||
那个max也是,什么值都不知道就开始比较,最后结果还是没有意义。

只要有一个没有意义的数据都可能造成溢出,那个程序里面有几百万个.....
粘土火星 - 2008/7/16 11:53:00
原帖由 Prz 于 2008-7-16 11:30:00 发表
嗯,另外,顶楼的算法好像是一种贪婪算法,那么应该是错的。
这道题不能用贪婪算法。


这个题能用的嘛,叙述里说的是“一下子”全冒出来……排一下序然后贪就可以了

PS:LZ为啥把排序注释掉了……囧

PS2:你用FP那两个数组定义是没问题的,问题在于你read时候没写下标等等等……
Prz - 2008/7/16 11:57:00
贪婪不一定能达到最佳值。

例1,一下子出现2支: 第一支1分停1秒,第二只10分停2秒;
例2,一下子出现3支: 第一支1分停1秒,第二、三只各10分停2秒。

贪婪算法的话这两个例子总有一个达不到最佳。

------------

哦,貌似我想复杂了,排序以后倒过来选应该可以贪婪。=v=

------------

至于下标,好像都是缺少i,难道是这个论坛屏蔽了一些字符?
果然
  1. [i]
复制代码
被当成UBB处理了... ||||||||||||||

以后贴代码记得用
  1. [code]
复制代码
标签哦
粘土火星 - 2008/7/16 12:12:00
原帖由 Prz 于 2008-7-16 11:57:00 发表
贪婪不一定能达到最佳值。

例1,一下子出现2支: 第一支1分停1秒,第二只10分停2秒;
例2,一下子出现3支: 第一支1分停1秒,第二、三只各10分停2秒。

贪婪算法的话这两个例子总有一个达不到最佳。


囧,那贪得也太纯了……

这两种情况最纯的是……………………把所有鼠的积分加起来就是解……囧
Prz - 2008/7/16 12:14:00
er... 第二种情况不能加...时间不够的
粘土火星 - 2008/7/16 12:16:00
原帖由 Prz 于 2008-7-16 12:14:00 发表
er... 第二种情况不能加...时间不够的


orz……眼花了

我看成第一只停1分1秒……第二只停10分2秒……囧
临终之梦 - 2008/7/16 12:45:00
不觉得这贴只有我们三儿在理睬么
临终之梦 - 2008/7/16 12:46:00
有兴趣的话做做这道吧:
五、火车线路(rai.pas)
(本题不作为模拟竞赛题,作为模拟赛后练习偏难题用,训练得部份分)
某列火车行使在C个城市之间(出发的城市编号为1,结束达到的城市的编号为C),假设该列火车有S个座位,现在有R笔预订票的业务。现在想对这R笔业务进行处理,看哪些预定能满足,哪些不能满足。
一笔预定由O、D、N三个整数组成,表示从起点站O到目标站D需要预定N个座位。一笔预定能满足是指该笔业务在行程范围内有能满足的空座位,否则就不能满足。一笔业务不能拆分,也就是起点和终点站不能更改,预定的座位数目也不能更改。所有的预定需求按给出先后顺序进行处理。
请你编写程序,看那些预定业务能满足,那些不能满足。

输入:
    输入文件中的第一行为三个整数C、S、R,(1<=c<=60 000, 1<=s<=60 000, 1<=r<=60 000)他们之间用空隔分开。接下来的R行每行为三个整数O、D、N,(1<=o<d<=c, 1<=n<=s),分别表示每一笔预定业务。

输出:
    对第I笔业务,如果能满足,则在输出文件中的第I行输出“T”,否则输出“N”

示例:
Rai.in
4 6 4
1 4 2
1 3 2
2 4 3
1 2 3
Rai.out
T
T
N
N
Prz - 2008/7/16 13:11:00
这道题好像目标定义不清吧,都不知道要干什么。我随便选一下也是正确答案么?

总要要求满足尽可能多的业务数目,或者使得空座位尽可能少吧
粘土火星 - 2008/7/16 14:06:00
原帖由 Prz 于 2008-7-16 13:11:00 发表
这道题好像目标定义不清吧,都不知道要干什么。我随便选一下也是正确答案么?

总要要求满足尽可能多的业务数目,或者使得空座位尽可能少吧


囧,也许还要加一条线路尽可能长
1
查看完整版本: 论坛里有会PASCAL的吗?帮个忙