1040 有几个PAT (25 分)
题目链接:1040 有几个PAT (25 分)
做这道题目,遇到了新的困难。解决之后有了新的收获,甚是欣喜!
刚开始我用三个vector数组存储P A T三个字符出现的位置,然后三层for循环,根据字符次序关系,
统计PAT出现的次数。这样提交后三个测试点超时。代码如下:
#include <bits/stdc++.h>
using namespace std; int num=;
char str[]; vector<int> p;
vector<int> a;
vector<int> t;
int main()
{
scanf("%s",str); //输入指定字符串
int count=;
for(int i=;i<strlen(str);i++)
{
if(str[i]=='P')
p.push_back(i);
else if(str[i]=='A')
a.push_back(i);
else
t.push_back(i);
}
for(int i=;i<p.size();i++)
{
for(int j=;j<a.size();j++)
{
for(int k=;k<t.size();k++)
{
if(p[i]<a[j]&&a[j]<t[k])
count++;
}
}
}
printf("%d",count%num);
return ;
}
后来改进为两层for循环,依旧超时!冥思苦想不得其解,不得已求助网上大神。
具体思想:要想知道构成多少个PAT,那么遍历字符串后对于每一个A,它前面的P的个数和它后面的
T的个数的乘积就是能构成PAT的个数。然后依次累加每个A的结果即可。
统计当前字符A的前面的P的个数简单容易
那么怎么统计当前字符A的后面的T的个数呢?
可以先遍历整个字符串统计整个字符串中T的个数。可以再下一次遍历时,遇到一个T就做一次自减操作,
这样就可以得到当前字符A的后面的T的个数。
整个算法伪代码如下
先遍历整个字符串,统计T的个数countT
遍历整个字符串
若遇到P,当前字符前的P的个数++,countP++
若遇到T,countT--,表示当前字符A后的T的个数
若遇到字符A,统计当前字符A可以构成多少个PAT,即countP*countT,然后累加每次A的结果。
#include <bits/stdc++.h>
using namespace std; char str[]; int main()
{
scanf("%s",str);
int ans=;
int countP,countT;
countP=countT=;
//先统计整个字符串中T的个数即countT
for(int i=;i<strlen(str);i++)
{
if(str[i]=='T')
countT++;
}
for(int i=;i<strlen(str);i++)
{
if(str[i]=='P')
countP++;
else if(str[i]=='T')
countT--;//总的T的个数减去待统计字符A的之前的T的个数,等于待统计A的之后的T的个数,秒!
else
ans=(ans+countP*countT)%;
}
printf("%d",ans);
return ;
}
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 Advanced 1153 Decode Registration Card of PAT (25 分)
A registration card number of PAT consists of 4 parts: the 1st letter represents the test level, nam ...
- PAT甲级——1153.Decode Registration Card of PAT(25分)
A registration card number of PAT consists of 4 parts: the 1st letter represents the test level, nam ...
- PAT 1040有几个PAT
原题:https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616 1040 有几个PAT (25 分) ...
- PAT乙级1040 有几个PAT
题目: 1040 有几个PAT (25分) 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位 ...
- PAT(B) 1040 有几个PAT(Java)
题目链接:1040 有几个PAT (25 point(s)) 题目描述 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T):第二个 ...
- PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)
1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the ...
随机推荐
- C#程序猿学习 Python
孙广东 2016.1.1 交互: C# 运行Python代码: http://stackoverflow.com/questions/11779143/run-a-python-script-fro ...
- “2014年ArcGIS影像高级培训班——5月份北京站”火热报名中!
您从事遥感类的相关工作吗?您正对着一景景影像数据不知从何下手吗?您有TB级甚至更高量级的影像数据须要有效管理.即时分享吗?您须要构建Web端的应用实现影像实时处理.在线分析吗? 您是否已经找到有效的解 ...
- 为PhoneGap写一个android插件
为PhoneGap写一个android插件,要怎么做? 其实这句话应该反过来说,为android写一个PhoneGap插件,要怎么做? 这里以最简单的Hello World!为例,做个说明: 1.第一 ...
- 2015南阳CCPC H - Sudoku 数独
H - Sudoku Description Yi Sima was one of the best counselors of Cao Cao. He likes to play a funny g ...
- 简析LCD1602液晶驱动及在Arduino上的实例实现
这几日在倒腾新到的Arduino,比起普通单片机来,感觉写程序太简单了.不过和外设打交道还是没那么容易,比如今天要说的看似简单的LCD1602液晶,却费了我一整天才基本搞懂,不过还是有一个小问题没有实 ...
- IEC61131-3——数据类型
1. 摘要 列出IEC61131-3支持的几种常用数据类型. 2. 内容 使用USB-CAN接口卡调试从站,SDO发送使用的功能码与字节的关系如下. 2f表示8位,2b表示16位,23表示32位数据. ...
- XAML实例教程系列 - 依赖属性和附加属性(四)
XAML实例教程系列 - 依赖属性和附加属性 2012-06-07 13:11 by jv9, 1479 阅读, 5 评论, 收藏, 编辑 微软发布Visual Studio 2012 RC和Wind ...
- 洛谷 P1083 [ NOIP 2012 ] 借教室 —— 线段树 / 二分差分数组
题目:https://www.luogu.org/problemnew/show/P1083 当初不会线段树的时候做这道题...对差分什么不太熟练,一直没A,放在那儿不管... 现在去看,线段树就直接 ...
- Linux进程状态查询
进程状态详细说明 Linux进程状态详细解析 ps 的参数说明 ps 提供了很多的选项参数,常用的有以下几个: l 长格式输出: u 按用户名和启动时间的顺序来显示进程: ...
- PCB Genesis 无需启动Xmanager图形窗口运行脚本 实现方法
从事PCB工程行业的都知道,启动Genesis需2个exe程序(Xmanager.exe与get.exe)需一起启动才可以打开我们熟悉的软件, 而Xmanager是图形窗口是给用户UI交互使用的,如果 ...