题目: 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. sql语句之随机查询记录和批量插入--基于mysql

    本周遇到了好几次数据库方面的问题,一个是上一篇文章提到的因为要修改数据结构引起的在表间复制字段的需求,另一个就是这篇文章要写的:1,从某个数据表中按照某个字段不重复的随机选取几百条记录:2,然后把这些 ...

  2. ASP.NET Core 3.0 实战:构建多版本 API 接口

    第一次在博客写分享,请多多捧场,如有歧义请多多包含! 因为业务需求发展需要,所以API接口的变更升级是必不可少的事情,而原有的接口是不可能马上停止使用的.例如:Login接口为例,1.0版本之返回用户 ...

  3. 在win10环境中安装xilinx vivado IDE时出现的问题及解决方法

    1.问题:There is no valid Xilinx installation that this Update can be applied to. 解决方法一:下载的是更新包,如果设备没有预 ...

  4. 20155209林虹宇 Exp6 信息搜集与漏洞扫描

    Exp6 信息搜集与漏洞扫描 1.信息收集 1.1通过DNS和IP挖掘目标网站的信息 whois查询 进行whois查询时去掉www等前缀,因为注册域名时通常会注册一个上层域名,子域名由自身的域名服务 ...

  5. 20155331《网路对抗》Exp8 WEB基础实践

    20155331<网路对抗>Exp8 WEB基础实践 基础问题回答 什么是表单 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签,这里面包含了处理表单数据所用CGI ...

  6. Linux日记Day3---Linux的文件属性与目录配置

    Linux最优秀的地方之一,就在于它的多用户.多任务环境.为了让用户具有较安全的管理机制,文件的权限管理是很重要的.Linux通常将文件的访问方式分为分为三个类别,分别是owner/group/oth ...

  7. 6.Xilinx RapidIO核仿真与包时序分析

    转自https://www.cnblogs.com/liujinggang/p/10123498.html 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件 ...

  8. 微信小程序之授权 wx.authorize

    一. wx.authorize(Object object) 提前向用户发起授权请求.调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据,但不会实际调用对应接口.如果用户之前已 ...

  9. ping命令使用及其常用参数

    PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量检查网络是否连通,可以很好地帮助我们分析和判定网络故障.Ping发送一个ICMP(Internet Con ...

  10. PAT甲题题解-1074. Reversing Linked List (25)-求反向链表

    题意说的很清楚了,这种题的话,做的时候最好就是在纸上自己亲手模拟一下,清楚一下各个指针的情况, 这样写的时候就很清楚各个指针变量保存的是什么值. PS:一次AC哈哈,所以说自己动手在纸上画画还是很有好 ...