【枚举Day1】20170529-2枚举算法专题练习 题解
题目: 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枚举算法专题练习 题解的更多相关文章
- 【枚举Day1】20170529-2枚举算法专题练习 题目
20170529-2枚举算法专题练习 题解: http://www.cnblogs.com/ljc20020730/p/6918360.html 青岛二中日期 序号 题目名称 输入文件名 输出文件名 ...
- NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先
系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...
- 【转载】[C#]枚举操作(从枚举中获取Description,根据Description获取枚举,将枚举转换为ArrayList)工具类
关键代码: using System; using System.Collections; using System.Collections.Generic; using System.Compone ...
- [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper
一.需求 我们在开发中经常会遇到一些枚举,而且这些枚举类型可能会在表单中的下拉中,或者单选按钮中会用到等. 这样用是没问题的,但是用过的人都知道一个问题,就是枚举的命名问题,当然有很多人枚举直接中文命 ...
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
JAVA进阶之旅(一)--增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法 学完我们的java之旅,其实收获还是很多的,但是依然还有很 ...
- 枚举进行位运算 枚举组合z
枚举进行位运算--枚举组合 public enum MyEnum { MyEnum1 = , //0x1 MyEnum2 = << , //0x2 MyEnum3 = << , ...
- [算法专题] LinkedList
前段时间在看一本01年出的旧书<effective Tcp/Ip programming>,这个算法专题中断了几天,现在继续写下去. Introduction 对于单向链表(singly ...
- 在C#中对枚举进行位运算--枚举组合
由于枚举的基础类型类型为基本的数值类型,支持位运算,因此可以使用一个值表示多个枚举的组合,在定义枚举时需要指定枚举数为2的幂指数方便进行位运算,即枚举数为1,2,4,8…,或1,1<<1, ...
- 枚举类型与位域枚举Enum
一.概述 定义一个值类型,其中包含固定值集合.枚举类型变量可以是此集合中的任意一个或多个值.枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚 ...
随机推荐
- 基于Python自动发送QQ群消息
1.准备工作 此次测试基于python3,需要安装qqbot.bs4.requests库. qqbot项目地址:https://github.com/pandolia/qqbot.git pip qq ...
- [SDOI2011]工作安排 BZOJ2245
分析: 费用流裸题,按照题面要求建边就可以了,语文题,我读了10多分钟才知道这题干啥...特别是注意一个细节a[j+1]-a[j]... 附上代码: #include <cstdio> # ...
- 20155232《网络对抗》Exp 6 信息搜集与漏洞扫描
20155232<网络对抗>Exp 6 信息搜集与漏洞扫描 一.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版 ...
- 查询表的DDL
例如: SQL>create table tab001(id varchar(4)); SQL>select dbms_metadata.get_ddl(‘TABLE’,’tab001’) ...
- cocos2d-x学习记录5——CCTransition场景过渡
利用CCTransition能够创建出一系列的场景过渡动画,能够使场景切换时更加绚丽丰富. CCTransition派生出很多过渡动画,传入的参数一般包括过渡时间和创建的场景. MyScene.h内容 ...
- 部署AlwaysOn第三步:集群资源组的健康检测和故障转移
资源组是由一个或多个资源组成的组,WSFC的故障转移是以资源组为单位的,资源组中的资源是相互依赖的.一个资源所依赖的其他资源必须和该资源处于同一个资源组,跨资源组的依赖关系是不存在的.在任何时刻,每个 ...
- Lambda学习---方法引用和其他基本应用
package com.zx; import java.util.*; import java.util.function.*; import java.util.stream.Collectors; ...
- 设计模式 笔记 状态模式 State
//---------------------------15/04/28---------------------------- //State 状态模式----对象行为型模式 /* 1:意图: ...
- AndroidPN环境建立
AndroidPN环境 AndroidPN实现了从服务器到android移动平台的文本消息推送.这里先简单说一下androidPN的安装过程. 下载androidpn-client-0.5.0.zip ...
- Jmeter(九)_获取JDBC响应做接口关联
在之前的文章-参数关联中,留个一个小尾巴,这里补充一下 http://www.cnblogs.com/Zfc-Cjk/p/8295495.html 1:从sql表中将需要取的数据查出来 2:我们需要把 ...