[USACO20FEB]Equilateral Triangles P 题解
优雅的暴力。
设三个点为 \((i,j,k)\),则有 \(6\) 个未知数即 \(x_i,x_j,x_k,y_i,y_j,y_k\)。又因为有 \(2\) 条关于这 \(6\) 个未知数的方程 \(ij=jk,ij=ik\),所以一定能通过枚举其中的 \(4\) 个量来求解,时间复杂度 \(O(n^4)\)。
而这个 \(O(n^4)\) 的暴力是肉眼可见的跑不满(
考虑先枚举点 \(i\),则有以下四种情况:

解得 \(x=a,y=a-b\)。
其中,\(a,x>0,0\le b,y \le a\)。

解得 \(x=a,y=a-b\)。
其中,其中,\(a,x>0,0\le b,y\le a,\color{red}b\not= 0\)。

解得 \(x=2b-a,y=b-a\)。
其中,\(0\le a<b,0\le x,y\)。

解得 \(x=2b-a,y=b-a\)。
其中,\(0\le a<b,0\le x,y,\color{red}a\not=0\)。
注意,有些同时存在于两种情况的状态, 需要通过标红的判断去除。
然后就能敲出以下代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=310;
inline int read(){
int x=0;
char c=getchar();
for(;(c^'.')&&(c^'*');c=getchar());
return c=='*';
}
bool c[maxn][maxn];
int n,ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(!c[i][j]) continue;
for(int a=0;a<=n;a++){
for(int b=0;b<=a;b++){
if(a&&i+a<=n&&j+a<=n&&i-a+b>0&&j+a+b<=n)
ans+=(c[i+a][j+a]&c[i-a+b][j+a+b]);
if(a&&b&&i-a>0&&j+a<=n&&i+a-b<=n&&j+a+b<=n)
ans+=(c[i-a][j+a]&c[i+a-b][j+a+b]);
}
for(int b=a+1;b<=n;b++){
if(i-b-b+a>0&&j+a<=n&&i-b+a>0&&j+a+b<=n)
ans+=(c[i-b-b+a][j+a]&c[i-b+a][j+a+b]);
if(a&&i+b+b-a<=n&&j+a<=n&&i+b-a<=n&&j+a+b<=n)
ans+=(c[i+b+b-a][j+a]&c[i+b-a][j+a+b]);
}
}
}
printf("%d\n",ans);
return 0;
}
然后你会获得 \(51pt\) 的高分。
容易发现,代码中搜索到了许多冗余的状态,考虑将判断放到循环之外:
#include<bits/stdc++.h>
using namespace std;
const int maxn=310;
inline int read(){
int x=0;
char c=getchar();
for(;(c^'.')&&(c^'*');c=getchar());
return c=='*';
}
bool c[maxn][maxn];
int n,ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(!c[i][j]) continue;
for(int a=0;a<=n;a++){
if(a&&i+a<=n&&j+a<=n)
for(int b=max(a-i+1,0);b<=a&&j+a+b<=n;b++)
ans+=(c[i+a][j+a]&c[i-a+b][j+a+b]);
if(a&&i-a>0&&j+a<=n)
for(int b=max(i+a-n,1);b<=a&&b<=n-j-a;b++)
ans+=(c[i-a][j+a]&c[i+a-b][j+a+b]);
if(j+a<=n)
for(int b=a+1;j+a+b<=n&&b+b<i+a;b++)
ans+=(c[i-b-b+a][j+a]&c[i-b+a][j+a+b]);
if(a&&j+a<=n)
for(int b=a+1;j+a+b<=n&&b+b<=n-i+a;b++)
ans+=(c[i+b+b-a][j+a]&c[i+b-a][j+a+b]);
}
}
printf("%d\n",ans);
return 0;
}
然后就过了。
祝AC。
[USACO20FEB]Equilateral Triangles P 题解的更多相关文章
- Project Euler 94:Almost equilateral triangles 几乎等边的三角形
Almost equilateral triangles It is easily proved that no equilateral triangle exists with integral l ...
- UVA 12651 Triangles
You will be given N points on a circle. You must write a program to determine how many distinctequil ...
- 《C与指针》第四章练习
本章问题 1.Is the following statement legal?If so,what does it do? (下面的语句是否合法,如果合法,它做了什么) 3 * x * x - 4 ...
- uva 11178 - Morley's Theorem
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- Matlab网格划分
之前转载了一篇博客http://blog.sina.com.cn/s/blog_6163bdeb0102dvay.html,讲Matlab网格划分程序Distmesh,看了看程序,感觉程序写得有很多值 ...
- UVA_11178_Morley's_Theorem_(计算几何基础)
描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=23&pag ...
- uva 11178 Morley's Theorem(计算几何-点和直线)
Problem D Morley's Theorem Input: Standard Input Output: Standard Output Morley's theorem states tha ...
- uva11178 Morley’s Theorem(求三角形的角三分线围成三角形的点)
Morley’s Theorem Input: Standard Input Output: Standard Output Morley’s theorem states that that the ...
- HTML入门12
开始了解响应式图片 响应式,根据屏幕尺寸和分辨率的设备上都能良好工作以及其他特性的图片,接下来考虑怎样创建自适应得图片,专注于img元素,完成自适应. 分辨率切换,不同的尺寸 <img srcs ...
随机推荐
- Codeforces Round #742 (Div. 2)
A. Domino Disaster 思路 按照题意模拟即可 如果是 对应关系为R --> R L --> L U --> D D --> U AC_CODE inline v ...
- resp.getWriter().print(categoryList)、resp.getWriter().write(String)与new ObjectMapper().writeValue(resp.getOutputStream(),categoryList)的区别
前言:最近在复习原生的servlet的时候,对其输出流不理解,故总结一下: resp.getWriter().print(categoryList) 可以输出字符串,也可以输出对象,可能还有其他类型, ...
- Shell编程中的用户输入处理
Linux read命令用于从标准输入读取数值. read 内部命令被用来从标准输入读取单行数据.这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据. 语法 read [-er ...
- java中Statement 对象
1.创建Statement对象建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句.Statement 对象用 Connection 的方法 createStatement 创建,如下列代码段 ...
- 利用系统APP实现导航---By张秀清
苹果系统本身自带一个地图APP,但是功能并不是很强大,但是一些简单的导航功能还是能做出来的,下面贴上我的代码 // // ViewController.m // 系统APP导航 // // Creat ...
- 论文翻译:2022_PACDNN: A phase-aware composite deep neural network for speech enhancement
论文地址:PACDNN:一种用于语音增强的相位感知复合深度神经网络 引用格式:Hasannezhad M,Yu H,Zhu W P,et al. PACDNN: A phase-aware compo ...
- 从MVC到DDD的架构演进
DDD这几年越来越火,资料也很多,大部分的资料都偏向于理论介绍,有给出的代码与传统MVC的三层架构差异较大,再加上大量的新概念很容易让初学者望而却步.本文从MVC架构角度来讲解如何演进到DDD架构. ...
- Flask中本地栈的使用
4种上下文变量 承接上一篇内容.当一个请求到来时,除了request被封装成全局变量之外,还有三个变量也是同样被封装成全局变量,那就是current_app.g.session.上面4个变量之所以能够 ...
- SpringBoot+JavaMailSender+Redis完整找回密码功能
导入maven坐标 <parent> <groupId>org.springframework.boot</groupId> <artifactId>s ...
- MShadow中的表达式模板
表达式模板是Eigen.GSL和boost.uBLAS等高性能C++矩阵库的核心技术.本文基于MXNet给出的教程文档来阐述MXNet所依赖的高性能矩阵库MShadow背后的原理. 编写高效的机器学习 ...