P2165 [AHOI2009]飞行棋
2024-10-20 15:58:50
题目描述
给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。
输入输出格式
输入格式:
第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度
输出格式:
所构成不重复矩形的个数
输入输出样例
输入样例#1:
8
1
2
2
3
1
1
3
3
输出样例#1:
3
说明
N<=20
Solution:
本题看似很水(确实很水),自己的想法却不够简便。
开始写了个暴力枚举$4$个点然后判断,老是处理不了重复的情况搞了半天一直$40$分。
其实,我们只需要处理出前缀和,然后$n^2$枚举$i,j$,当$s[j]-s[i]==s[n]/2$时,计数器$ans++$,因为我们知道矩形的两条邻边所成的圆周角$=\pi$,所以弧长为$\frac{c}{2}$($c$为圆的周长),于是我们这样统计出来的是满足条件的成对角的点对个数,那么最后的答案就是$ans*(ans-1)/2$(简单的组合,每个点对可以和剩下$ans-1$个点对搭配组成矩形,然后每个会重复算一次,所以除以$2$就$OK$了)。
代码:
#include<bits/stdc++.h>
#define il inline
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
using namespace std;
const int N=;
int n,a[N],s[N],ans;
il void solve(){
For(i,,n) For(j,,n)if(s[j]-s[i]==s[n]/)ans++;
cout<<ans*(ans-)/;
}
int main(){
ios::sync_with_stdio();
cin>>n;
For(i,,n)cin>>a[i];
For(i,,n)s[i]=s[i-]+a[i];
solve();
return ;
}
最新文章
- 20个非常棒的jQuery倒计时脚本
- PHP 模拟 HTTP 基本认证(Basic Authentication)
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q45-Q48)
- abrtd是什么进程
- android: 播放音频
- NV OIT algorithm : Depth peeling is a fragment-level depth sorting technique
- 2015-10-11 Sunday 晴 ARM学习
- INI解析模块的C++实现
- 开源的Android开发框架-------PowerFramework使用心得(五)网络请求HTTPRequest
- (原)不明白JNI指针调用顺序
- JS复习:第二十三章
- codeforces 803C Maximal GCD(GCD数学)
- javascript内存管理(堆和栈)和javascript运行机制
- day2-Python基本数据类型介绍
- express+handlebars 快速搭建网站前后台
- 牛客网 272B Xor Path(树上操作)
- 浏览器登录Dynamics 365 CE没毛病,程序连接却报错。
- C#运行时通过字符串实例化类对象
- 2017-5-5/PHP实现负载均衡的加权轮询
- 炫龙笔记本的gtx965m显卡玩游戏很卡
热门文章
- NOIP2018初赛 解题报告
- NOIP2018赛前停课集训记(10.24~11.08)
- tableviewcell折叠问题,(类似qq列表展开形式) 多个cell同时展开,OC版 和 Swift
- CUDA 中dim3含义
- 梁勇Java语言程序设计第三章全部例题 为第五次作业
- 1046: [HAOI2007]上升序列
- Apache 配置默认编码
- web前端-回调函数sort详解
- hadoop核心组件概述及hadoop集群的搭建
- Java总结 - List实现类ArrayList&;LinkedList