1040. 有几个PAT(25)
原题: https://www.patest.cn/contests/pat-b-practise/1040
思路: 先给大家扔个测试PAPAATTPATTT, 人工查一下这段字符串能组成
34个PAT.
这一题我自己的想法非常的渣, 也非常复杂, 最后看了OliverLew大神的解答,
才明白这题原来是这样搞的. 本题的解法非常类似"在线处理"的思想.
观察下面3段字符串
- PA (只能组成1个PA)
- PAPA (第一个A能组成1个PA, 第2个A能组成2个PA, 一共1+2=3个PA)
- PAPAPA (1 + 2 + 3 = 6个PA)
现在我们看一下PAPAATTPATTT这个字符串, 我们不要一开始就盯着PAT这
3个字符, 而是先看字符串里有多少P, 再看有多少PA, 最后确定有多少PAT.
从左到右一个一个字符的看, 下面我给字符串标上号
PAPAATTPAT T T
0123456789 10 11 - 走到下标0, P=1, PA=0, PAT=0
- 走到下标1, P=1, PA=1, PAT=0
- 走到下标2, P=2, PA=1, PAT=0
- 走到下标3, P=2, PA=1+2=3, PAT=0
- 走到下标4, P=2, PA=3+2=5, PAT=0
- 走到下标5, P=2, PA=5, PAT=5
- 走到下标6, P=2, PA=5, PAT=5+5=10
- 走到下标7, P=3, PA=5, PAT=10
- 走到下标8, P=3, PA=5+3=8, PAT=10
- 走到下标9, P=3, PA=8, PAT=10+8=18
- 走到下标10, P=3, PA=8, PAT=18+8=24
- 走到下标0, P=3, PA=8, PAT=24+8=34
相信大家已经看明白, 是的就这么简单, 寥寥10几行搞定, 我一开始自己搞了
6个多小时, 代码一百多行, 还是不能全对, 思想太重要了.
注意取余数是在中间过程就取, 不用等到最后总数再取余.
完整实现:
#include <stdio.h>
#define MOD 1000000007
int main (void) {
long int p = 0;
long int pa = 0;
long int pat = 0;
char ch;
while ((ch = getchar()) != '\n') {
if (ch == 'P') p++;
if (ch == 'A') pa = (pa + p) % MOD;
if (ch == 'T') pat = (pat + pa) % MOD;
}
printf("%ld", pat);
return 0;
}
参考资料:
OliverLew的简书: http://www.jianshu.com/p/65291de1906b
1040. 有几个PAT(25)的更多相关文章
- 1040 有几个PAT (25 分)
题目:1040 有几个PAT (25 分) 思路: 是个规律题,只要找到规律就有思路,那代码基本就有了,就是怎么实现比较好和是否简洁的问题. 很明显:A是分水岭,A前面有多少个P和A后面有多少个T知道 ...
- PAT Basic 1040 有几个PAT (25 分)
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T). 现 ...
- 1040 有几个PAT (25 分)C语言
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位§,第 4 位(A),第 6 位(T). 现给定字符 ...
- PAT 1040有几个PAT
原题:https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616 1040 有几个PAT (25 分) ...
- PAT(B) 1040 有几个PAT(Java)
题目链接:1040 有几个PAT (25 point(s)) 题目描述 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T):第二个 ...
- PAT乙级1040 有几个PAT
题目: 1040 有几个PAT (25分) 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位 ...
- PAT-乙级-1040. 有几个PAT(25)
1040. 有几个PAT(25) 时间限制 120 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 字符串APPAPT中包含了两个单 ...
- PAT (Basic Level) Practise (中文)-1040. 有几个PAT(25)
1040. 有几个PAT(25) http://www.patest.cn/contests/pat-b-practise/1040 字符串APPAPT中包含了两个单词“PAT”,其中第一个P ...
- 1040 有几个PAT (25 分)
题目链接:1040 有几个PAT (25 分) 做这道题目,遇到了新的困难.解决之后有了新的收获,甚是欣喜! 刚开始我用三个vector数组存储P A T三个字符出现的位置,然后三层for循环,根据字 ...
- PAT-B 1040. 有几个PAT(25)
1040. 有几个PAT(25) 时间限制 120 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 字符串APPAPT中包含了两个单 ...
随机推荐
- 【转】VS2008快速将代码中字符串改为_T(“”)风格的方法
用VC在修改一些老程序的时候,经常面临“UNICODE化”的工作.就是将一些传统C语言风格的字符串,如“string”,改为既能够通过多字节编码工程编译,又能通过UNICODE工程编译的代码,即形如_ ...
- 【SJSB】 android-javascript开发框架
这是一个本人开发的android壳,作用就是为html5开发提供各种接口以调用native. 只是第一个版本,随笔以纪念.详细的说明和api都在 项目的readme中. 项目地址: https://g ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第14章节--使用Office Services开发应用程序 WOPI和新的Office Web Apps Server
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第14章节--使用Office Services开发应用程序 WOPI和新的Office Web Apps Server ...
- mybatis由浅入深day02_3一对多查询
3 一对多查询 3.1 需求(查询订单及订单明细的信息) 查询订单及订单明细的信息. 3.2 sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. ...
- css揭秘读书笔记
currentColor属性让hr和段落相同的颜色: div { color: red; } hr { background: currentColor; /* 一定要设置高度*/ height: 0 ...
- tableview随笔
//获得row NSInteger row = [[self.treeTableViewindexPathForCell:(UITableViewCell *)[[[notification.user ...
- Java Integer常量池
public class IntegerExample { public static void main(String[] javalatte) { Integer i = 10; Integer ...
- printf如何输出64位整数
From: http://blog.csdn.net/zzqhost/article/details/6064886 关于printf函数输出64位数的问题,其实在window下和linux下是不一样 ...
- java基础---->Base64算法的使用
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息.详细的Base64信息,可以参见维基百科:https://en.wikipedia.org ...
- MQTT-SN协议乱翻之小结篇
前言 这里简单做一些小结和对比,针对前面的协议翻译部分,一阶段的学习完结. MQTT-SN VS MQTT MQTT-SN基于MQTT原有语义,但做了很多的调整.比如: 一个CONNECT消息被拆分为 ...