切换到宽版
  • 21456阅读
  • 29回复

比一比,赛一赛,谁的程序比我快系列之~2 [复制链接]

上一主题 下一主题
离线r134a
只看该作者 10 发表于: 2006-09-03
I want something in PASCAL !
.


祝大家明年NOIP大获全盛!


.
离线swj05652
只看该作者 11 发表于: 2006-09-03

1291861   10:05:07  3 Sep 2006  swj05652   1200  Pascal   Accepted 0.015  270 KB

  1. var

  2.   i,j,k:longint;
  3.   a,b,max,best,now:double;
  4.   mei,mej:longint;
  5. begin
  6.   readln(a,b);readln(k);
  7.   max:=-1;
  8.   for i:=0 to k do begin
  9.     best:=b/2;
  10.     if best-trunc(best)>0.5 then j:=trunc(best)+1 else j:=trunc(best);
  11.     if j>k-i then j:=k-i;
  12.     if j<0 then j:=0;
  13.     now:=i*a-i*i+j*b-j*j;
  14.     if now>max then begin
  15.       max:=now;
  16.       mei:=i;mej:=j;
  17.     end;
  18.   end;
  19.   writeln(max:0:2);
  20.   writeln(mei,' ',mej);
  21. end.

     

1条评分
r134a 威望 +1 - 2006-09-03
离线swj05652
只看该作者 12 发表于: 2006-09-03
既不需要掐时 也不需要剪枝 枚举的角数量 用二次函数的知识算蹄的最优值
离线stevenjl

只看该作者 13 发表于: 2006-09-03
说到数学方法,我似乎想到了一种更加快的公式……
但是懒得高兴编了……就这样吧,暂时认输吧……
Dream Walker...
离线r134a
只看该作者 14 发表于: 2006-09-04
引用第13楼stevenjl2006-09-03 22:51发表的“”:
说到数学方法,我似乎想到了一种更加快的公式……
但是懒得高兴编了……就这样吧,暂时认输吧……




别啊!!!
.


祝大家明年NOIP大获全盛!


.
离线stevenjl

只看该作者 15 发表于: 2006-09-04
1292975 11:13:16
4 Sep 2006 oifans1 1200 C Accepted
0.001 222 KB
  1. #include <stdio.h>
  2. main()
  3. {
  4.   double p1,p2;
  5.   int n,m1,m2,zs;
  6.   scanf("%lf%lf", &p1, &p2);
  7.   scanf("%d",&n);
  8.   if (p1 < 0) p1=0;
  9.   if (p2 < 0) p2=0;
  10.   zs=floor(p1/2);
  11.   m1=(p1 /2 - zs) > 0.5 ? zs+1:zs;
  12.   zs=floor(p2/2);
  13.   m2=(p2 /2 - zs) > 0.5 ? zs+1:zs;
  14.   if (n < (m1+m2))
  15.   {
  16.     double temp;
  17.     temp=(p1-p2+2*n)/4;
  18.     zs=floor(temp);
  19.     m1= ((temp- zs) > 0.5) ? zs+1:zs;
  20.     if (m1 < 0) m1=0;
  21.     if (m1 > n) m1=n;
  22.     m2=n-m1;
  23.   }
  24.   printf("%.2f\n",((m1*p1) + (m2*p2) - m1*m1 -m2*m2));
  25.   printf("%d %d\n",m1,m2);
  26.   return 0;
  27. }


  中午我抽空写了一下。代码放这里,就先不解释了,还要睡午觉,下午还要上课。晚上再来解释……
  晚上修正了一下……
Dream Walker...
离线r134a
只看该作者 16 发表于: 2006-09-04
I want something in PASCAL !
.


祝大家明年NOIP大获全盛!


.
离线r134a
只看该作者 17 发表于: 2006-09-04
帖程序的要给出原理啊!!!
.


祝大家明年NOIP大获全盛!


.
离线stevenjl

只看该作者 18 发表于: 2006-09-04
关于数学解释:
  1. 令horns价格为p1,数量为m1;令hoofs价格为p2,数量为m2
  2. 由于horns获利的S1=p1 * m1 - m1*m1;
  3. 所以当m1=p1/2时,获利最大。hoofs同理。
  4. 当题目给出的n大于m1+m2时,当然就直接输出m1,m2行了。
  5. 否则,收到n的限制,horns和hoofs无法取到最优值。
  6. 所以S总=p1*m1+p2*m2 -m1*m1 -m2*m2;
  7. 因为m2=n-m1,所以代入得。
  8. S总=p1*m1 + p2*(n-m1) - m1*m1 - (n-m1)*(n-m1)
  9. 整理得:S总=-m1^2 + (p1-p2+2n) *m1 +p2*n-n^2
  10. 对S总求导,得S'总=p1-p2-4m1+2n
  11. 令S'总=0,得m1=(p1-p2+2n) / 4。
  12. 所以就直接求得了m1。
  13. 【严重注意】没有学过求导的不要找我来教,高三会学的……



因为某人要Pascal语言的,就写了个……
  1. program ural1200;
  2. var p1,p2,temp:real;
  3.   n,m1,m2,zs:integer;
  4. begin
  5. read(p1,p2,n);
  6. if p1 < 0 then p1:=0;
  7. if p2 < 0 then p2:=0;
  8. zs:=trunc(p1/2);
  9. if (p1/2 - zs) > 0.5 then m1:=zs+1 else m1:=zs;
  10. zs:=trunc(p2/2);
  11. if (p2/2 - zs) > 0.5 then m2:=zs+1 else m2:=zs;
  12. if n < (m1+m2) then
  13. begin
  14.   temp:=(p1-p2+2*n) /4;
  15.   zs:=trunc(temp);
  16.   if (temp - zs) > 0.5 then m1:=zs+1 else m1:=zs;
  17.   if m1 < 0 then m1:=0;
  18.   if m1 > n then m1:=n;
  19.   m2:=n-m1;
  20. end;
  21. temp:=m1 * p1 + m2 * p2 -m1*m1 -m2*m2;
  22. writeln(temp:1:2);
  23. writeln(m1,' ',m2);
  24. end.
Dream Walker...
离线r134a
只看该作者 19 发表于: 2006-09-06
让你失望了,学过求导了...
.


祝大家明年NOIP大获全盛!


.
快速回复
限100 字节
 
上一个 下一个