博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[AHOI2009]飞行棋
阅读量:5164 次
发布时间:2019-06-13

本文共 1407 字,大约阅读时间需要 4 分钟。

 

刚开始想这道题的时候确实很蒙,只想到矩形对边做对应的弧长相等,然后想办法凑出相等的弧长。其实正解很简单,不要去想边,应该想对角线,因为根据初中园的知识,这个矩形的对角线是圆的直径,而直径所对的弧是周长的一半,所以只要每局两个指针 i,j,如果这两个的距离是周长一半的话,就cnt++,所以最终的cnt就是直径的个数,所以答案就是C(2, cnt)。

用前缀和预处理距离。

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 using namespace std;12 #define enter printf("\n")13 #define space printf(" ")14 #define Mem(a) memset(a, 0, sizeof(a))15 typedef long long ll;16 typedef double db;17 const int INF = 0x3f3f3f3f;18 const int eps = 1e-8;19 const int maxn = 25;20 inline ll read()21 {22 ll ans = 0;23 char ch = getchar(), last = ' ';24 while(!isdigit(ch)) {last = ch; ch = getchar();}25 while(isdigit(ch)) {ans = ans * 10 + ch - '0'; ch = getchar();}26 if(last == '-') ans = -ans;27 return ans;28 }29 inline void write(ll x)30 {31 if(x < 0) x = -x, putchar('-');32 if(x >= 10) write(x / 10);33 putchar(x % 10 + '0');34 }35 36 int n, a[maxn], sum[maxn], cnt = 0;37 38 int main()39 {40 n = read();41 for(int i = 1; i <= n; ++i) a[i] = read(), sum[i] = sum[i - 1] + a[i];42 for(int i = 1; i <= n; ++i)43 for(int j = i; j <= n; ++j)44 if(sum[j] - sum[i] == (sum[n] >> 1)) cnt++;45 write(cnt * (cnt - 1) >> 1); enter;46 return 0;47 }
View Code

 

转载于:https://www.cnblogs.com/mrclr/p/9519352.html

你可能感兴趣的文章
geoserver 开发1
查看>>
几个小软件,让你上网更轻松
查看>>
C# 将DataTable里面的数据导出到excel
查看>>
分支无限的有根数
查看>>
旋转变换(一)旋转矩阵
查看>>
Java写的九九乘法表
查看>>
[转载] 字符串处理相关算法
查看>>
mac os Catalina beta Jetbrains idea闪退解决方案
查看>>
云计算术语扫盲
查看>>
CoreData的使用-2
查看>>
C++ STL算法系列2---find ,find_first_of , find_if , adjacent_find的使用
查看>>
重新定位svn地址的方法(windows和linux),svn switch(sw)的帮助信息
查看>>
sqlserver 为表添加一个自增主键
查看>>
JavaScript 作用域
查看>>
装饰者模式
查看>>
Ubuntu 14.10 下安装SVN
查看>>
eclipse/myeclipse SVN资源库URL中文乱码问题解决办法
查看>>
SpringMVC注解@RequestMapping的有关探讨
查看>>
解决iPhone Safari 兼容性CSS背景显示不全问题
查看>>
10种ADC软件滤波方法及程序
查看>>