切换到宽版
  • 32978阅读
  • 49回复

NOIP2006提高组满分源代码 [复制链接]

上一主题 下一主题
离线archimedes
 

只看楼主 倒序阅读 0 发表于: 2006-11-19
— 本帖被 archimedes 执行取消置顶操作(2007-07-16) —
NOIP2006提高组满分源代码

注:来源: www.oiers.cn
energy:

  1. {
  2. Problem: Noip 2006 Problem 1
  3. Algorithm: Dynamic Programming
  4. }
  5. const
  6. maxn = 100;
  7. var
  8. n, i, j, k, p, ans:longint;
  9. data:array[1..maxn,1..2] of longint;
  10. dp:array[1..maxn,1..maxn] of longint;
  11. function max(a, b:longint):longint;
  12. begin
  13. if a > b then max:=a else max:=b;
  14. end;
  15. begin
  16. assign(input,'energy.in');
  17. reset(input);
  18. assign(output,'energy.out');
  19. rewrite(output);
  20. { input }
  21. read(n);
  22. for i:=1 to n do read(data[i, 1]);
  23. { Main }
  24. data[n, 2]:=data[1, 1];
  25. for i:=1 to n - 1 do data[i, 2]:=data[i+1, 1];
  26. fillchar(dp, sizeof(dp), 0);
  27. for p:=1 to n-1 do
  28.   for i:=1 to n do
  29.   begin
  30.     j:=(i + p - 1) mod n + 1;
  31.     if i < j then
  32.     begin
  33.     for k:=i to j-1 do
  34.       dp[i, j]:=max(dp[i, j], dp[i, k] + dp[k+1, j] +
  35.         data[i, 1] * data[k, 2] * data[j, 2]);
  36.     end;
  37.     if i > j then
  38.     begin
  39.     for k:=i to n-1 do
  40.       dp[i, j]:=max(dp[i, j], dp[i, k] + dp[k+1, j] +
  41.         data[i, 1] * data[k, 2] * data[j, 2]);
  42.     dp[i, j]:=max(dp[i, j], dp[i, n] + dp[1, j] +
  43.       data[i, 1] * data[n, 2] * data[j, 2]);
  44.     for k:=1 to j-1 do
  45.       dp[i, j]:=max(dp[i, j], dp[i, k] + dp[k+1, j] +
  46.         data[i, 1] * data[k, 2] * data[j, 2]);
  47.     end;
  48.   end;
  49. { output }
  50. ans:=-1;
  51. for i:=1 to n do
  52. begin
  53.   j:=(i + n - 2) mod n + 1;
  54.   ans:=max(ans, dp[i, j]);
  55. end;
  56. writeln(ans);
  57. close(input);
  58. close(output);
  59. end.


JSP:




  1. {
  2. Problem: Noip 2006 Problem 3
  3. Algorithm: Simulation
  4. }
  5. const
  6. maxn = 20;
  7. maxm = 20;
  8. maxs = 5000;
  9. type
  10. Tseq = record
  11.       st, ed:longint;
  12.       end;
  13. var
  14. n, m, i, j, k, ans:longint;
  15. ma, tim, x, y:longint;
  16. t:array[1..maxn] of longint;
  17. data, a:array[1..maxn*maxm] of longint;
  18. num:array[1..maxn,1..maxm] of longint;
  19. time:array[1..maxn,1..maxm] of longint;
  20. free:array[1..maxm,1..maxs] of Tseq;
  21. count:array[1..maxm] of longint;
  22. last:array[1..maxn] of longint;
  23. function max(a, b:longint):longint;
  24. begin
  25. if a > b then max:=a else max:=b;
  26. end;
  27. function find_free(k, ma, tim:longint; var x, y:longint):longint;
  28. var
  29. i, minx, best:longint;
  30. begin
  31. minx:=maxlongint;
  32. for i:=1 to count[ma] do
  33.   if free[ma, i].ed - free[ma, i].st >= tim then
  34.     if last[k] <= free[ma, i].st then
  35.     begin
  36.     if free[ma, i].st < minx then
  37.     begin
  38.       minx:=free[ma, i].st;
  39.       best:=i;
  40.     end;
  41.     end else
  42.     if (last[k] > free[ma, i].st) and (last[k] + tim <= free[ma, i].ed) then
  43.     begin
  44.     if last[k] < minx then
  45.     begin
  46.       minx:=last[k];
  47.       best:=i;
  48.     end;
  49.     end;
  50. find_free:=best;
  51. x:=minx;
  52. y:=x + tim;
  53. end;
  54. begin
  55. assign(input,'jsp.in');
  56. reset(input);
  57. assign(output,'jsp.out');
  58. rewrite(output);
  59. { input }
  60. read(m, n);
  61. for i:=1 to m * n do read(data[i]);
  62. for i:=1 to n do
  63.   for j:=1 to m do read(num[i, j]);
  64. for i:=1 to n do
  65.   for j:=1 to m do read(time[i, j]);
  66. { Main }
  67. fillchar(t, sizeof(t), 0);
  68. for i:=1 to n * m do
  69. begin
  70.   inc(t[data[i]]);
  71.   a[i]:=t[data[i]];
  72. end;
  73. fillchar(last, sizeof(last), 0);
  74. for i:=1 to m do
  75. begin
  76.   count[i]:=1;
  77.   free[i, 1].st:=0;
  78.   free[i, 1].ed:=maxlongint;
  79. end;
  80. for i:=1 to n * m do
  81. begin
  82.   ma:=num[data[i], a[i]];
  83.   tim:=time[data[i], a[i]];
  84.   k:=find_free(data[i], ma, tim, x, y);
  85.   inc(count[ma]);
  86.   free[ma, count[ma]].st:=y;
  87.   free[ma, count[ma]].ed:=free[ma, k].ed;
  88.   free[ma, k].ed:=x;
  89.   last[data[i]]:=y;
  90. end;
  91. { output }
  92. ans:=-1;
  93. for i:=1 to m do
  94.   for j:=1 to count[i] do
  95.     if free[i, j].ed = maxlongint then
  96.     ans:=max(ans, free[i, j].st);
  97. writeln(ans);
  98. close(input);
  99. close(output);
  100. end.


budget:




  1. {
  2. Problem: Noip 2006 Problem 2
  3. Algorithm: Dynamic Programming
  4. }
  5. const
  6. maxm = 61;
  7. maxn = 32000;
  8. var
  9. n, m, i, j, k, ans:longint;
  10. cost, p, q, cost_tmp, p_tmp:array[1..maxm] of longint;
  11. data:array[1..maxm] of longint;
  12. flag:array[1..maxm] of byte;
  13. dp:array[1..maxm+1,-1..2,0..maxn] of longint;
  14. function max(a, b:longint):longint;
  15. begin
  16. if a > b then max:=a else max:=b;
  17. end;
  18. begin
  19. assign(input,'budget.in');
  20. reset(input);
  21. assign(output,'budget.out');
  22. rewrite(output);
  23. { input }
  24. read(n, m);
  25. for i:=1 to m do
  26.   read(cost[i], p[i], q[i]);
  27. { Main }
  28. k:=0;
  29. for i:=1 to m do
  30.   if q[i] = 0 then
  31.   begin
  32.     inc(k);
  33.     data[k]:=i;
  34.     flag[k]:=1;
  35.     for j:=1 to m do
  36.     if q[j] = i then
  37.     begin
  38.       inc(k);
  39.       data[k]:=j;
  40.       flag[k]:=0;
  41.     end;
  42.   end;
  43. // huan yuan cost
  44. for i:=1 to m do
  45. begin
  46.   cost_tmp[i]:=cost[data[i]];
  47.   p_tmp[i]:=p[data[i]];
  48. end;
  49. cost:=cost_tmp;
  50. p:=p_tmp;
  51. for i:=1 to m+1 do
  52.   for j:=-1 to 2 do
  53.     for k:=0 to n do
  54.     dp[i, j, k]:=-1;
  55. dp[1, -1, 0]:=0;
  56. for i:=1 to m do
  57.   for k:=0 to N do
  58.   begin
  59.     if flag[i] = 1 then
  60.     begin
  61.     for j:=-1 to 2 do
  62.     begin
  63.       if dp[i, j, k] = -1 then continue;
  64.       if k + cost[i] <= n then
  65.         dp[i+1, 0, k+cost[i]]:=max(dp[i+1, 0, k+cost[i]], dp[i, j, k] + cost[i] * p[i]);
  66.       dp[i+1, -1, k]:=max(dp[i+1, -1, k], dp[i, j, k]);
  67.     end;
  68.     end;
  69.     if flag[i] = 0 then
  70.     begin
  71.     for j:=-1 to 2 do
  72.     begin
  73.       if dp[i, j, k] = -1 then continue;
  74.       case j of
  75.       -1   : dp[i+1, j, k]:=max(dp[i+1, j, k], dp[i, j, k]);
  76.       0, 1 : begin
  77.               if k + cost[i] <= n then
  78.               dp[i+1, j+1, k+cost[i]]:=max(dp[i+1, j+1, k+cost[i]], dp[i, j, k] + cost[i] * p[i]);
  79.               dp[i+1, j, k]:=max(dp[i+1, j, k], dp[i, j, k]);
  80.             end;
  81.       2   : dp[i+1, j, k]:=max(dp[i+1, j, k], dp[i, j, k]);
  82.       end;
  83.     end;
  84.     end;
  85.   end;
  86. { output }
  87. ans:=0;
  88. for j:=-1 to 2 do
  89.   for k:=0 to n do
  90.     ans:=max(ans, dp[m+1, j, k]);
  91. writeln(ans);
  92. close(input);
  93. close(output);
  94. end.


digital




  1. const inf               ='digital.in';
  2.     ouf               ='digital.out';
  3.     maxn               =512;
  4.     pw                 :array[1..9]of longint=(2,4,8,16,32,64,128,256,512);
  5.     mol               =1000000;
  6. type bignum             =array[0..50]of longint;
  7. var   k,w,n,i,p,j           :longint;
  8.     f                 :array[boolean,0..maxn]of bignum;
  9.     ans               :bignum;
  10. procedure init;
  11. begin
  12.   assign(input,inf);
  13.   reset(input);
  14.   readln(k,w);
  15.   n:=1;
  16.   for i:=1 to k do
  17.   n:=n*2;
  18.   close(input);
  19. end;
  20. procedure hiadd(var a,b:bignum);
  21. var i,j,n,tmp             :longint;
  22.   ta                 :bignum;
  23. begin
  24.   if a[0]<b[0] then a[0]:=b[0];
  25.   for i:=1 to a[0] do
  26.   a[i]:=a[i]+b[i];
  27.   for i:=1 to a[0] do
  28.   begin
  29.     tmp:=a[i] div mol; inc(a[i+1],tmp);
  30.     a[i]:=a[i] mod mol;
  31.   end;
  32.   if a[a[0]+1]>0 then inc(a[0]);
  33. end;
  34. procedure cal;
  35. var     now,last     :boolean;
  36.       change     :boolean;
  37.       max       :longint;
  38. begin
  39.   p:=k;
  40.   now:=true; last:=false;
  41.   fillchar(f,sizeof(f),0);
  42.   for i:=0 to n do
  43.   begin
  44.     f[now,i][0]:=1; f[now,i][1]:=1;
  45.   end;
  46.   dec(n);
  47.   if w>k*n then w:=k*n;
  48.   ans[0]:=1; ans[1]:=0;
  49.   repeat
  50.   now:=not now; last:=not last;
  51.   fillchar(f[now],sizeof(f[now]),0);
  52.   change:=false;
  53.   inc(p,k);
  54.   if p>w then
  55.     begin
  56.     dec(p,k); max:=w-p; p:=w;
  57.     end
  58.   else max:=k;
  59.   hiadd(f[now,n-1],f[last,n]);
  60.   for i:=n-2 downto 0 do
  61.     begin
  62.       f[now,i]:=f[now,i+1];
  63.       hiadd(f[now,i],f[last,i+1]);
  64.     end;
  65.   if p>2*k then hiadd(ans,f[now,0]);
  66.   until p=w;
  67.   for i:=1 to pw[max]-1 do
  68.   hiadd(ans,f[now,i]);
  69.   assign(output,ouf);
  70.   rewrite(output);
  71.   n:=ans[0];
  72.   write(ans[n]);
  73.   for i:=n-1 downto 1 do
  74.   begin
  75.     max:=mol div 10;
  76.     while max<>0 do
  77.     begin
  78.       write(ans[i] div max mod 10);
  79.       max:=max div 10;
  80.     end;
  81.   end;
  82.   writeln;
  83.   close(output);
  84. end;
  85. begin
  86. init; cal;
  87. end.
[ 此贴被sammy312在2006-11-25 09:52重新编辑 ]
离线morethan
只看该作者 1 发表于: 2006-11-20
楼主辛苦,谢了!
已收藏!
离线76363723
只看该作者 2 发表于: 2006-11-22
这是今年复赛的答案吗.?
离线76363723
只看该作者 3 发表于: 2006-11-22
本部分内容设定了隐藏,需要回复后才能看到
离线lhzb
只看该作者 4 发表于: 2006-11-22
请问有没有C的
离线lhzb
只看该作者 5 发表于: 2006-11-22
请问有没有C的
离线wolf
只看该作者 6 发表于: 2006-11-22
我要普及的!!!
离线liuyinsitan
只看该作者 7 发表于: 2006-11-23
顶一下
离线网络虾客
只看该作者 8 发表于: 2006-11-23
拜托,,,,从我那copy的也写个......来源....
离线solomonw
只看该作者 9 发表于: 2006-11-24
copy的?
快速回复
限100 字节
 
上一个 下一个