USACO 2014 JAN滑雪场建设{Gold题2}

滑雪场建设{Gold2}

【问题描述】

滑雪场的设计图是一个M*NM x N (1 <= M,N <= 100)的矩阵,每个格子里用一个字母R(表示粗糙)或者S(表示平整)。

比如:

RSRSSS

RSRSSS

RSRSSS

农民约翰的拖拉机每次可以将一块B*B (B <= M, B <= N)的区域全部标记B*B (B <= M, B <= N)的R或者S,他希望B能够尽量地大。一个格子可以被多次标记,下一次标记能够覆盖前一次标记,每个格子可以都至少被标记一次。

【文件输入】

第一行,两个用空格隔开的整数,分别表示M,N。

接下来2.. M+1行,每行一个M个符号,R或者S。表示用标记成的目标状态。

【文件输出】

共一行,一个整数,表示B的最大值。

【输入样例】

3 6

RSRSSS

RSRSSS

RSRSSS

【输出样例】

3

【样例说明】

首先将第1到第3列全部标记为R,然后第2到第4列全部标记为S,接下来将第3到5列全部标记为R,最后将第4到6列全部标记为S。

思路:每次考虑最后一步,能放上去的最大正方形边长是多少,然后将这块正方形上的每个点标记成任意(可R可S)以此类推下去,直到所有的点都被标记成了任意,运行结束。找最大正方形时用dp的思想来找f[i,j]:=min(min(f[i-1,j],f[i,j-1]),f[i-1,j-1])+1。可是这样的话还有最后一个点会超时,这时我们就需要使用一点点的小技巧,它叫卡时算法,略估计下大概运行几次能达到最优,然后卡时。下面上代码

 1 var
 2 a,f,g:array[-1..100,-1..100]of longint;                  //a为字母代号1表示R,2表示S,0表示任意;f,g分别表示以R和S为结尾的最大正方形
 3 used:array[-1..100,-1..100]of boolean;                   //used表示该点是否已被处理
 4 i,j,n,m,tx,ty,ans,posi,posj,flag,time,maxfg:longint;     //flag记录剩余的没处理的点的个数;time用来计时
 5
 6 procedure openit;
 7  begin
 8   assign(input,‘skicourse.in‘);assign(output,‘skicourse.out‘);
 9   reset(input);rewrite(output);
10  end;
11
12 procedure closeit;
13  begin
14   close(input);close(output);
15  end;
16
17 procedure datain;                      //数据读入以及处理
18  var i,j:longint;
19      ch:char;
20   begin
21    readln(n,m);
22    flag:=n*m;ans:=10000000;time:=0;
23    //fillchar(used,sizeof(used),false);
24    //fillchar(f,sizeof(f),0);
25    //fillchar(g,sizeof(g),0);
26    for i:=1 to n do
27     begin
28      for j:=1 to m do
29       begin
30        read(ch);
31        if ch=‘R‘ then a[i,j]:=1
32                  else a[i,j]:=2;
33       end;
34      readln;
35     end;
36   end;
37
38 function min(a,b:longint):longint;
39  begin
40   if a<b then min:=a
41          else min:=b;
42  end;
43
44 function max(a,b:longint):longint;
45  begin
46   if a>b then max:=a
47          else max:=b;
48  end;
49
50
51 begin
52  openit;
53  datain;
54  while flag>0 do
55   begin
56    for i:=tx to n do                             //处理出当前最大正方形的边长
57     for j:=ty to m do
58      begin
59       f[i,j]:=min(min(f[i-1,j],f[i,j-1]),f[i-1,j-1])+1;
60       g[i,j]:=min(min(g[i-1,j],g[i,j-1]),g[i-1,j-1])+1;
61       if a[i,j]=1 then g[i,j]:=0;
62       if a[i,j]=2 then f[i,j]:=0;
63      end;
64    posi:=1;posj:=1;maxfg:=0;
65    for i:=1 to n do                              //找出最大正方形所在的位置
66     for j:=1 to m do
67      if (max(f[i,j],g[i,j])>maxfg) and not used[i,j] then
68       begin
69        posi:=i;posj:=j;
70        maxfg:=max(f[i,j],g[i,j]);
71       end;
72    if maxfg<ans then ans:=maxfg;
73    used[posi,posj]:=true;
74    for i:=posi-maxfg+1 to posi do                 //修改原图
75     for j:=posj-maxfg+1 to posj do
76      if a[i,j]<>0 then
77       begin
78        dec(flag);
79        a[i,j]:=0;
80       end;
81    tx:=posi-maxfg+1;ty:=posj-maxfg+1;
82    inc(time);
83    if time=5000 then break;                      //卡时
84   end;
85   writeln(ans);
86  closeit;
87 end.
时间: 2024-10-09 16:50:28

USACO 2014 JAN滑雪场建设{Gold题2}的相关文章

USACO 2014 JAN 滑雪录像{silver题3}

滑雪录像{silver题3} [问题描述] 冬奥会的电视时刻表包含N (1 <= N <= 150)个节目,每个节目都有开始和结束时间.农民约翰有两台录像机,请计算他最多可以录制多少个节目. [文件输入] 第一行,一个整数N. 接下来N行每行两个整数,表示一个节目的开始和结束时间,范围为0..1,000,000,000. [文件输出] 一个整数,表示最多可以录制的节目数量. [输入样例] 6 0 3 6 7 3 10 1 5 2 8 1 9 [输出样例] 4 [样例说明] 第1台录制节目1和3

USACO翻译:USACO 2014 JAN三题(2)

USACO 2014 JAN 一.题目概览 中文题目名称 队伍平衡 滑雪录像 滑雪场建设 英文题目名称 bteams recording skicourse 可执行文件名 bteams recording skicourse 输入文件名 bteams.in recording.in skicourse.in 输出文件名 bteams.out recording.out skicourse.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比

USACO 2014 FEB自动打字{Silver题1}

自动打字{Silver题1} [问题描述] 贝西新买了手机,打字不方便,请设计一款应用,帮助她快速发消息. 字典里有W(W<=30000)个小写字母构成的单词,所有单词的字符总数量不超过1,000,000,这些单词是无序的.现在给出N(1 <= N <= 1000)个询问,每个询问i包含一个的字符串s_i(每个字符串最多包含1000个字符)和一个整数K_i,对于所有以s_i为前缀的单词,其中按字典序排序后的第K_i个单词,求该单词在原字典里的序号. [文件输入] 第一行为两个整数W和N.

USACO 2014 JAN 滑雪录像

2. 滑雪录像{silver题3} [问题描述] 冬奥会的电视时刻表包含N (1 <= N <= 150)个节目,每个节目都有开始和结束时间.农民约翰有两台录像机,请计算他最多可以录制多少个节目. [文件输入] 第一行,一个整数N. 接下来N行每行两个整数,表示一个节目的开始和结束时间,范围为0..1,000,000,000. [文件输出] 一个整数,表示最多可以录制的节目数量. [输入样例] 6 0 3 6 7 3 10 1 5 2 8 1 9 [输出样例] 4 [样例说明] 第1台录制节目

USACO翻译:USACO 2012 JAN三题(1)

USACO 2012 JAN(题目一) 一.题目概览 中文题目名称 礼物 配送路线 游戏组合技 英文题目名称 gifts delivery combos 可执行文件名 gifts delivery combos 输入文件名 gifts.in delivery.in combos.in 输出文件名 gifts.out delivery.out combos.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较方式 全文比较 全文比较 全文比

USACO翻译:USACO 2013 JAN三题(1)

USACO 2013 JAN 一.题目概览 中文题目名称 镜子 栅栏油漆 奶牛排队 英文题目名称 mirrors paint lineup 可执行文件名 mirrors paint lineup 输入文件名 mirrors.in paint.in lineup.in 输出文件名 mirrors.out paint.out lineup.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较方式 全文比较 全文比较 全文比较 二.运行内存限制

USACO翻译:USACO 2012 JAN三题(2)

USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛跑步 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking baleshare cowrun 输入文件名 stacking.in baleshare.in cowrun.in 输出文件名 stacking.out baleshare.out cowrun.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较方

USACO翻译:USACO 2014 US Open 三题

USACO 2014 US Open 一.题目概览 中文题目名称 牧场装饰 里程表 牛像展览 英文题目名称 decorate odometer fairphoto 可执行文件名 decorate odometer fairphoto 输入文件名 decorate.in odometer.in fairphoto.in 输出文件名 decorate.out odometer.out fairphoto.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 1

USACO翻译:USACO 2014 DEC Silver三题

USACO 2014 DEC SILVER 一.题目概览 中文题目名称 回程 奶牛IDs 搬家 英文题目名称 piggyback cowids relocate 可执行文件名 piggyback cowids relocate 输入文件名 piggyback.in cowids.in relocate.in 输出文件名 piggyback.out cowids.out relocate.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较