题目: http://www.cnblogs.com/ljc20020730/p/6918328.html

评测器:cena

评测记录:

1.OneMoreRectangle 一个矩形

●如果任意枚举矩形坐标,显然不可行。数组太大,开不下!
●我们注意到,如果我们放入了矩形,矩形周围并没有其它矩形,那么稍微移动这个矩形,不会改变答案。
显然,一定存在一种方案,使得放入的矩形的边界与某些已知矩形边界重合。
我们不妨规定,放入的矩形下边界必须与已知矩形重合、左边界必须与已知矩形重合。

所以就可以做了

 type rec=record
x1,y1,x2,y2:longint;
end;
var n,x,y,i,j,k,ans,max,xx,yy:longint;
a:array[..]of rec;
begin
assign(input,'rectangle.in');
assign(output,'rectangle.out');
reset(input);
rewrite(output);
readln(n,x,y);
for i:= to n do
readln(a[i].x1,a[i].y1,a[i].x2,a[i].y2);
for i:= to n do
for j:= to n do begin
xx:=a[i].x1; yy:=a[j].y1;
ans:=;
for k:= to n do
if (a[k].x1>=xx)and(a[k].x1<=xx+x)and(a[k].y1>=yy)and(a[k].y2<=yy+y)
and(a[k].x2>=xx)and(a[k].x2<=xx+x)and(a[k].y2>=yy)and(a[k].y2<=yy+y)
//这里是判断以第i个矩形的左下角坐横标X1,第j个矩形的左下角纵坐标Y1围成的X*Y的矩形能不能覆盖第k个矩形
then inc(ans);
if ans>max then max:=ans;
end;
writeln(max);
close(input);
close(output);
end.

评测记录:

2.Palindromes回文

对于目前已经实现的算法的平均时间复杂度为O(length(s)*k/2)或许更少,

但是实在想不出办法来优化,于是就这样放在这里吧!

 var k,i,ans:longint;
s:ansistring;
function check(l,r:longint):boolean;//判断字符串s从l位到r位是否为回文
var th:ansistring;
i:longint;
begin
th:='';
for i:=l to r do th:=th+s[i];
for i:= to length(th)div + do
if th[i]<>th[length(th)-i+] then exit(false);
exit(true);
end;
begin
assign(input,'palin.in');
assign(output,'palin.out');
reset(input);
rewrite(output);
readln(k);
readln(s);
for i:= to length(s) do begin
if i+k->length(s) then break;
if check(i,i+k-) then inc(ans);
end;//枚举当前点和后面连这个点加起来为k位是否为回文
  writeln(ans); 
close(input);
close(output);
end.

评测记录:

3.ProblemSetter(问题的设置)

一开始想的复杂,选排快排一起用太复杂了点。暴力好像拿了92分!

现在讲一种很简单的办法!

排序+枚举(排序:按照简单-中等-困难的顺序输出)
解决方法是:先从小到大枚举E,再从大到小枚举H,最后从小到大枚举M,取每个值第一个遇到的解。(注意枚举不重复)
“你希望难度差尽量接近”定义一个函数F(x,y,z:longint):longint;

function F(x,y,z:longint):longint;
begin
exit(abs((a[y]-[x])-(a[z]-a[y])));
end;

接下来是程序:

 var n,i,j,e,m,h,k:longint;
a:array[..]of longint;
procedure swap(var a,b:longint);
var t:longint;
begin
t:=a; a:=b; b:=t;
end;
function f(x,y,z:longint):longint;
begin
exit(abs(abs(a[y]-a[x])-abs(a[z]-a[y])));
end;
begin
assign(input,'problemsetter.in');
assign(output,'problemsetter.out');
reset(input);
rewrite(output);
readln(n);
for i:= to n do read(a[i]);
for i:= to n- do
for j:=i+ to n do
if a[i]>a[j] then swap(a[i],a[j]);
E:=; M:=; H:=n;//这是所有组合中f最大的!
for i:= to n do //任意
for k:=n downto i+ do //从最后向前推,注意第i位是E的,第i+1位是M的,所以只能到i+2
for j:=i+ to k- do //从E到H(不包含E和H)都可以选
if f(i,j,k)<f(E,M,H) then begin
E:=i;M:=j;H:=k;//迭代
end;
writeln(a[E],' ',a[M],' ',a[H]);//输出
close(input);
close(output);
end.

评测记录:

4.ColoringRectangles着色的矩形

这道题需要遵循以下步骤

提供以下样例:

输入:


输出:


(1)递归求出每一个矩形被覆盖后能看到的面积(注意从后往前枚举,后保存当前编号ans[i])。
定义一个过程:

procedure cal(l,r,b,t,z:longint); //z为从上到下的该层编号(看下还有多少可能的其他编号的矩形在上面)。
begin
while (z<=n) and ((r<=x1[z]) or (l>=x2[z]) or (t<=y1[z]) or (b>=y2[z])) do inc(z);//一些不符合条件的矩形
if z>n then begin inc(area[now],(r-l)*(t-b));exit;end; //求出area
if l<x1[z] then begin cal(l,x1[z],b,t,z+);l:=x1[z];end;
if r>x2[z] then begin cal(x2[z],r,b,t,z+);r:=x2[z];end;
if b<y1[z] then cal(l,r,b,y1[z],z+);
if t>y2[z] then cal(l,r,y2[z],t,z+);//分割成四块来求
end;

(2)按面积area从大到小,相同面积按编号从小到大编号排序

for i:= to n- do
for j:=i+ to n do
if (area[i]<area[j])or((area[i]=area[j])and(ans[i]>ans[j]))
then begin swap(area[i],area[j]); swap(ans[i],ans[j]); end;

(3)再按编号从小到大对k个编号ans[]排序,这样可以按字典序输出。

 for i:= to k- do
for j:=i+ to k do
if ans[i]>ans[j] then swap(ans[i],ans[j]);

完整的程序:

 var x1,y1,x2,y2,area,ans:array[..]of longint;
n,k,now,i,j:longint;
procedure swap(var a,b:longint);
var t:longint;
begin
t:=a; a:=b; b:=t;
end;
procedure cal(l,r,b,t,z:longint);
begin
while (z<=n) and ((r<=x1[z]) or (l>=x2[z]) or (t<=y1[z]) or (b>=y2[z])) do inc(z);
if z>n then begin inc(area[now],(r-l)*(t-b));exit;end;
if l<x1[z] then begin cal(l,x1[z],b,t,z+);l:=x1[z];end;
if r>x2[z] then begin cal(x2[z],r,b,t,z+);r:=x2[z];end;
if b<y1[z] then cal(l,r,b,y1[z],z+);
if t>y2[z] then cal(l,r,y2[z],t,z+);
end;
begin
assign(input,'rectangles.in');
assign(output,'rectangles.out');
reset(input);
rewrite(output);
readln(n,k);
for i:= to n do read(x1[i]); readln;
for i:= to n do read(y1[i]); readln;
for i:= to n do read(x2[i]); readln;
for i:= to n do read(y2[i]); readln;
for i:=n downto do begin
ans[i]:=i;
now:=i;
cal(x1[now],x2[now],y1[now],y2[now],i+);
end;
for i:= to n- do
for j:=i+ to n do
if (area[i]<area[j])or((area[i]=area[j])and(ans[i]>ans[j]))
then begin swap(area[i],area[j]); swap(ans[i],ans[j]); end;
for i:= to k- do
for j:=i+ to k do
if ans[i]>ans[j] then swap(ans[i],ans[j]);
for i:= to k- do write(ans[i]-,' ');
writeln(ans[k]-);
close(input);
close(output);
end.

 评测记录:

【枚举Day1】20170529-2枚举算法专题练习 题解的更多相关文章

  1. 【枚举Day1】20170529-2枚举算法专题练习 题目

    20170529-2枚举算法专题练习 题解: http://www.cnblogs.com/ljc20020730/p/6918360.html 青岛二中日期 序号 题目名称 输入文件名 输出文件名 ...

  2. NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先

    系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...

  3. 【转载】[C#]枚举操作(从枚举中获取Description,根据Description获取枚举,将枚举转换为ArrayList)工具类

    关键代码: using System; using System.Collections; using System.Collections.Generic; using System.Compone ...

  4. [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper

    一.需求 我们在开发中经常会遇到一些枚举,而且这些枚举类型可能会在表单中的下拉中,或者单选按钮中会用到等. 这样用是没问题的,但是用过的人都知道一个问题,就是枚举的命名问题,当然有很多人枚举直接中文命 ...

  5. JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法

    JAVA进阶之旅(一)--增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法 学完我们的java之旅,其实收获还是很多的,但是依然还有很 ...

  6. 枚举进行位运算 枚举组合z

    枚举进行位运算--枚举组合 public enum MyEnum { MyEnum1 = , //0x1 MyEnum2 = << , //0x2 MyEnum3 = << , ...

  7. [算法专题] LinkedList

    前段时间在看一本01年出的旧书<effective Tcp/Ip programming>,这个算法专题中断了几天,现在继续写下去. Introduction 对于单向链表(singly ...

  8. 在C#中对枚举进行位运算--枚举组合

    由于枚举的基础类型类型为基本的数值类型,支持位运算,因此可以使用一个值表示多个枚举的组合,在定义枚举时需要指定枚举数为2的幂指数方便进行位运算,即枚举数为1,2,4,8…,或1,1<<1, ...

  9. 枚举类型与位域枚举Enum

    一.概述 定义一个值类型,其中包含固定值集合.枚举类型变量可以是此集合中的任意一个或多个值.枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚 ...

随机推荐

  1. Luence

    Luence 是Apache软件基金会的一个项目,是一个开发源码的全文检索引擎工具包,是一个全文检索引擎的一个架构.提供了完成的查询引擎和检索引擎,部分文本分析引擎. 全文检索程序库,虽然与搜索引擎相 ...

  2. 【LeetCode7】Reverse Integer★

    题目描述: 解题思路: 反转的方法很简单,重点在于判断溢出的问题,下面给出了两种方法. Java代码: 方法一: 判断溢出方法:在执行完int newResult=result*10+tail语句后, ...

  3. spring boot项目配置RestTemplate超时时长

    配置类: @Configuration public class FeignConfiguration { @Bean(name="remoteRestTemplate") pub ...

  4. 从0开始学golang--2.1--如何去爬园子的数据

    20天过去了,才开始写...主要还是因为自己懒吧.之前一边上班一边也有挤时间练习golang,可是写博客却老是不能行动,跑步也没跑了.突然的就懈怠了快一个月.可能也和开始玩the elder scro ...

  5. EZ 2017 12 30 2018noip第二次膜你赛

    去年的比赛了,然而今天才改好. 总体难度适中,有大佬AK. 主要是自己SB第二题没想出来,然后又是可怜的100来分. T1 一道二分+数学的题目. 我们可以二分叫的次数,然后用公式(等差数列,公差都是 ...

  6. Android与Libgdx入门实例

    本文讲解如何实现Android与Libgdx各自的Hello World过程. 1. Android版Hello World 点击Eclipse快捷方式,选择New Android Applicati ...

  7. [CF983D]Arkady and Rectangles[线段树+可删堆/set]

    题意 你有一个无限大的绘图板,开始颜色是\(0\) , 你将进行\(n\) 次绘图,第\(i\) 次绘图会将左下角为 \((x_1, y_1)\),右上角为\((x_2, y_2)\) 的矩形涂成颜色 ...

  8. JQuery快速入门-操作元素的属性和样式

    我们在学习JavaScript时,详细介绍了DOM对象.从DOM树可以得知,对DOM的操作,主要包括:元素的属性.内容.值.CSS. 一.元素属性的操作 在 jQuery 中,可以对元素的属性执行获取 ...

  9. HTML 列表实例

    41.无序列表本例演示无序列表.<h4>一个无序列表</h4><ul> <li>咖啡</li> <li>茶</li> ...

  10. 测试开发:Python+Django实现接口测试工具

    Python+Django接口自动化 引言: 最近被几个公司实习生整自闭了,没有基础,想学自动化又不知道怎么去学,没有方向没有头绪,说白了其实就是学习过程中没有成就感,所以学不下去.出于各种花里胡哨的 ...