BZOJ 1800
1800: [Ahoi2009]fly 飞行棋
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1622 Solved: 1293
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1
2
2
3
1
1
3
3
Sample Output
HINT
N<= 20
这个题需要有初中数学的基础,因为圆的内接矩形,他的对角线是直径,所以,就要找出直径的条数,然后将直径两两组合,每两条不同的直径可以组成一个矩形,这里用到组合数,
答案就是C(2,直径条数)
如何求直径条数呢
就是将若干条连续弧相加,使等于圆周长一半就是直径,弧的端点就是直径的端点
我们有一种比较慢的方法求直径条数,复杂度n^2
for(int i=;i<n;++i)
for(int j=;j<n;++j)
if(s[j]-s[i-]==number) //number是圆周长的一半,s是前缀和
ans++;
其实这种方法也不是太慢,也就比快的方法慢几MS,可能是数据小吧……
有一种比较快的方法
和一道题思路基本一致
这是代码
#include<iostream>
using namespace std; int main()
{
int n;
cin>>n;
int sum=,maxl=;
for(int i=;i<=n;++i)
{
int number;
cin>>number;
sum+=number;
maxl=max(sum,maxl);
if(sum<)sum=;
}
cout<<maxl;
return ;
}
最大子段和
我们就稍微改一改就能将上面那个比较慢的方法变成线性啦
int total=;
int ans=;
for(int i=,j=;i<n;++i)
{
total+=s[i];
while(total>number)
total-=s[j++];
if(total==number)
ans++;
}
只是一定要注意两个地方容易出错
1、循环到n-1
2、while(total>number)
total-=s[j++];如果不用while的话,结果可以想象……不是会变慢的问题,是答案有可能不对的问题…… 完整代码如下
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std; int s[],f[];
int n,number=; void quit()
{
printf("");
exit();
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i)
{
scanf("%d",&s[i]);
number+=s[i];
f[i]=f[i-]+s[i];
}
if(number&)quit();
number>>=;
int total=;
int ans=;
for(int i=,j=;i<n;++i)
{
total+=s[i];
while(total>number)
total-=s[j++];
if(total==number)
ans++;
}
if(ans<)quit();
printf("%d",ans*(ans-)>>);
return ;
}
这个题也是比较水的……相对于BZOJ的其他题……
BZOJ 1800的更多相关文章
- [BZOJ 1800] 飞行棋
Link: BZOJ 1800 传送门 Solution: $O(n^4)$…… Code: #include <bits/stdc++.h> using namespace std; ] ...
- bzoj 1800: [Ahoi2009]fly 飞行棋 暴力
1800: [Ahoi2009]fly 飞行棋 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- BZOJ 1800: [Ahoi2009]fly 飞行棋( 枚举 )
O(N2)算出有x条直径然后答案就是x(x-1)/2...这个数据范围是闹哪样! ----------------------------------------------------------- ...
- BZOJ 1800: [Ahoi2009]fly 飞行棋【思维题,n^4大暴力】
1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1689 Solved: 1335[Submit][St ...
- bzoj 1800 & 洛谷 P2165 [AHOI2009]飞行棋 —— 模拟
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1800 https://www.luogu.org/problemnew/show/P21 ...
- bzoj 1800 [Ahoi2009]fly 飞行棋——模拟
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1800 原来只想到一个弧是一条边. 然后发现不是.差点不会做.经Zinn提醒,不用枚举那条边由 ...
- bzoj 1800 暴力枚举
直接暴力枚举四个点,然后判断是否能组成矩形就行了 注意枚举的点的标号从小到大,保证不重复枚举 /**************************************************** ...
- BZOJ 1800 fly-飞行棋
这道题其实考察的就是从其中能找到几条直径,因为这次数据范围比较小,所以只需设一个二维数组,记录一下每个点及每个点从零开始的位置,最后定一个变量记录周长,最后用个循环搜一下位置小于周长一半 ...
- BZOJ 1800 [Ahoi2009]fly 飞行棋
题目链接 思路 终于有一道自己想出来的题了,开心. 因为是矩形,一定有直角,所以考虑直径,之后由于矩形对角线是两条直径,所以考虑组合数. 直径有n条,矩形有c(n,2)个. #include<i ...
随机推荐
- Truffle基础篇-Truffle做什么的?怎么安装?
Truffle基础篇-Truffle做什么的?怎么安装? truffle资料汇总 http://truffle.tryblockchain.org/truffle3.0-integrate-nodej ...
- 利用jquery操作dom时,用event.target优化dom操作
html: <ul id="contents"> <li data-link="#part1">Part 1</li> &l ...
- 网络流——poj1273(入门)
题目链接:排水沟 题意:现有n个排水沟和m个点(其中1是源点,m是汇点),给定n个排水沟所连接的点,求从源点到汇点的最大流量. [EK解法] #include <algorithm> #i ...
- CubieTruck使用笔记--SD卡中使用lubuntu
http://docs.cubieboard.org/tutorials/ct1/installation/install_lubuntu_desktop_server_to_sd_card 按照上面 ...
- centos7 centos6中 更改默认的系统启动级别
centos6中更改默认的启动级别 方法: 1.vi /etc/inittab 2.找到id:x:initdefault:,我的系统是id:3:initdefault:,即默认以字符模式启动. 3.将 ...
- Laravel 5 如何实现网站在维护模式下允许指定 IP 用户访问(白名单)
为了测试需要,有时候需要在网站处于维护模式下允许特定IP访问网站,在 Laravel 中,这可以通过为维护模式编写自定义中间件来实现. 默认情况下,Laravel 使用 CheckForMainten ...
- hdu 1207 汉诺塔II (DP+递推)
汉诺塔II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- LwIP - 打开keepalive功能
在服务器端打开keepalive功能 1.保证LWIP_TCP_KEEPALIVE被定义为1,(这样TCP_KEEPIDLE.TCP_KEEPINTVL和TCP_KEEPCNT 设置才有效) 2. i ...
- Vue项目中引入外部文件(css、js、less)
例子中css文件采用bootstrap.css,js文件采用jQuery,less文件用less.less(自定义文件) 步骤一:安装webpack cnpm install webpack -g 步 ...
- 浅析 nth-child(n) 和 nth-of-type(n)
首先看一个例子 <div> <p>第一个段落</p> <p>第二个段落</p> </div> p:nth-child(2) { ...