HDOJ5907(BC上分之旅却死在了水题上)
来源:互联网 发布:最小截图软件 编辑:程序博客网 时间:2024/06/08 04:00
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5907
题目大意就是说,给定一个字符串,找出里面q连续的地方,得到一个数,比如样例
quailtyqqq
第一个q只有自己一个,那么就只有一种排列方式,到了后面的qqq,排列方式就有六种了,单独q排一次,三种,每相邻的两个q排一次,那就是两次,再来就是三个q一起排,又是一次。
所以输出7。
这,实在是太简单了,比如qqq,其实就是3+2+1,qqqq就是4+3+2+1。然后,为什么A(3,3)也是等于6啊!我一开始以为是组合数然后完美的wa了一发,我就懵逼了好久,后面才发现,这不就是一个梯形公式吗?这还不是关键的。
我们来看看数据量,这个字符串最长可以到100000,五个0,十万,如果全部都是q,会有什么后果?按照梯形公式,(1+100000)*100000 / 2,这个数字算出来最后是50亿多吧,你像我那么天真,sum用long long,但是计算他有多少个q的那个计数变量cout,却用了int 吗?int最高是到21亿的啊。。。所以上面这个数据,sum是可以存下,但是就是说(1+cout)*cout / 2,cout是int型,所以它参与运算最后得出的结果只能会是int型,这就瞬间存不下了,尽管你的sum是long long。所以,只需要,把cout改成long long,然后就过了,我的天啊!!!!我怎么这么蠢啊,我保证不再犯这种错误了!
代码如下:
#include<stdio.h> int main(){int T, i, j;char s[100005];long long sum, cout;scanf("%d",&T);while(T--){sum = 0;scanf("%s",s);for(i = 0; s[i]; i++){if(s[i] == 'q'){for(j = i, cout = 0; s[j] == 'q'; j++)cout++;i = j - 1;sum += (cout + 1) * cout / 2;}}printf("%I64d\n", sum);}}
0 0
- HDOJ5907(BC上分之旅却死在了水题上)
- 【BC史上最大灾难】一场被我搞砸了的BC
- git 上合并分之的冲突解决
- 终于打了一场BC。。。
- 解决apcu-bc在安装中出现的问题。 今天在编译安装apcu-bc时出现了:apc.so: undefined symbol: zif_apcu_store in Unknown on line 0
- 国密SM2,SM3,SM4在BC上的实现(一)
- 国密SM2,SM3,SM4在BC上的实现(二)
- 在csdn上安家了!~~~~~~~~~~~~~~~
- 安家了 在csdn上
- bc
- bc
- bc
- bc
- BC
- BC
- 破除BC上的制度限制
- Fxx and game(bc上的题)
- 排序分之
- 文件的保存及读取
- Java关键字final用法
- 从零写u-boot,用于启动内核
- Android开发各类常见错误解决方案
- JQuery拓展方法之表单数据转Object—从而ajax post到后台
- HDOJ5907(BC上分之旅却死在了水题上)
- Java IO笔记
- babasport Redis使用实例
- Matlab基础之高维矩阵创建和应用
- Linux(7)RedHat7 基本命令六-date命令详解
- ThinkPHP教程
- Spark踩坑记--数据库
- Android开发学习之路-自定义控件
- 获得android设备的唯一标识