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 ...
随机推荐
- 数据结构之中序遍历转兴许遍历(JAVA实现)(二)
算法流程: 主要分为四步: 1.当前字符为数字或者字母,则直接输出 2.当前字符为).则在栈中匹配输出.一直匹配到),则停止输出(就是将)及其顶上的元素所有弹出来输出) 3.当前字符为操作符.则比較当 ...
- IOS - 设置与帮助界面
设置与帮助 改动头像, 改动password, 移动客服, 帮助, 声明, 关于我们. 代码 // // IndexSetting600ViewController.h // SymptomCheck ...
- Android自定义用户控件简单范例(二)
对于完全由后台定制的控件,并不是很方便其他人的使用,因为我们常常需要看到控件放到xml界面上的效果,并根据效果进行布局的调整,这就需要一个更加标准的控件制作流程: 我们的自定义控件和其他的控件一样,应 ...
- # 导入模块 from wxpy import * # 初始化机器人,扫码登陆 bot = Bot()
# 导入模块 from wxpy import * # 初始化机器人,扫码登陆 bot = Bot()
- Prevent the "split brain" by configuring the majority of nodes
## Prevent the "split brain" by configuring the majority of nodes (total number of nodes / ...
- 【树剖求LCA】树剖知识点
不太优美但是有注释的版本: #include<cstdio> #include<iostream> using namespace std; struct edge{ int ...
- tiny4412 裸机程序 一、说明【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37109115 首先.我想说明为什么我写这个文档?我自己想学点东西,过于求成,又过于自信,直接买了 ...
- 【高德地图API】Pivot控件中加载地图并禁止Pivot手势
如题,解决方案,参考[Windows phone应用开发[20]-禁止Pivot手势]http://www.cnblogs.com/chenkai/p/3408658.html. xaml代码清单 ...
- Flink编程练习
目录 1.wordcount 2.双流警报EventTime 3.持续计数stateful + timer + SideOutputs 4.一定时间范围内的极值windowfunction + che ...
- C语言过时了?为什么还要推荐每一位程序员都来学一下C语言?
互联网蓬勃发展的时代,有一类人做出了巨大的贡献,这一群人被大家称之为程序员,怎样才能成为一名优秀的程序员呢,为什么每一个程序员都需要学习C语言呢? 就让我来跟大家分享分享: 在学习C/C++或者想 ...