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
原创粉丝点击