【枚举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高速排序
import random def rand(n): for i in range(n): yield random.randint(0,1000) #创建一个随机数列表 def createList ...
- c# 无边框窗体的边框阴影
Windows API: using System; using System.Collections.Generic; using System.ComponentModel; using Syst ...
- 20155232《网络对抗》Exp5 MSF基础应用
20155232<网络对抗>Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode. exploit:就是利用可能存在的漏洞对目标进行攻击 ...
- [THUSC2017]巧克力[斯坦纳树、随机化]
题意 题目链接 分析 对于第一问,如果颜色数量比较少的话可以 \(\binom{cnt}{k}\) 枚举最终连通块中的 \(k\) 种颜色,然后利用斯坦纳树求解. 如果颜色比较多,考虑将所有的颜色重新 ...
- 命令行模式和python交互模式
一.命令行模式 在Windows开始菜单选择“命令提示符”,就进入到命令行模式,它的提示符类似C:>:. 二.Python交互模式 在命令行模式下敲命令python,就看到类似如下的一堆文本输出 ...
- 解决SSH登录用户执行的命令部分环境变量参数不生效的问题
问题概况 linux机器在/etc/profile配置完成环境变量后,SSH到目标机器执行命令,但是获取不到已配置的环境变量值. 例如场景: 在/etc/profile配置了http代理 export ...
- LABVIEW串口通信基础
写这一篇串口通信基础的契机是最近刚刚完成一个温箱的仪器控制程序,LABVIEW通过串口与温箱单片机通讯,我打算将过程中遇到的一些问题和收获列在这里方便有需求的网友比对.寻找答案. 学LABVIEW时间 ...
- MODIS 数据产品预处理
MODIS 数据产品预处理 1 MCTK重投影 第一步:安装ENVI的MCTK扩展工具 解压压缩包,将其中的mctk.sav与modis_products.scsv文件复制到如图所示,相应的ENVI ...
- Git版本库的创建(Ubuntu)
在Ubuntu上学习Git随笔. 一. git 仓库的安装 git 在终端用git命令查看Ubuntu是否安装git版本库,如果没有安装,最新版本(Ubuntu18.04)会提示用下面命令进行安装. ...
- React笔记-事件分发
事件分发 之前讲述了事件如何绑定在document上,那么具体事件触发的时候是如何分发到具体的监听者呢?我们接着上次注册的事件代理看.当我点击update counter按钮时,触发注册的click事 ...