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 ...
随机推荐
- BZOJ 2338 HNOI2011 数矩形 计算几何
题目大意:给定n个点,求一个最大的矩形,该矩形的四个顶点在给定的点上 找矩形的方法是记录全部线段 若两条线段长度相等且中点重合 这两条线段就能够成为矩形的对角线 于是我们找到全部n*(n-1)/2条线 ...
- checkbox是否选中判断
三种方式: $('#checkAll').bind('click',function(){ //第一种 console.log(this.checked); //第二种 console.log($(t ...
- tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37407423 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一 ...
- JSP页面的跳转及传值
1.response.sendRedirect("跳转到页面的URL"); 该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,使浏览器显示重定向网页的内容. ...
- E20170706-sl
erode vt. 侵蚀,腐蚀 vi. 逐渐毁坏; 削弱,损害; thin adj. 薄的; 瘦的; 细的; 稀少的; laptop n. 便携式电脑;
- 4.28 QBXT模拟赛
NOIP2016提高组模拟赛 ——By wangyurzee7 中文题目名称 迷妹 膜拜 换数游戏 英文题目与子目录名 fans mod game 可执行文件名 fans mod game 输入文件名 ...
- C#使用Parallel处理数据同步写入Datatable并使用BulkInsert批量导入数据库
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL). 业务流程:选择照片文件夹,分别访问照片-->调用DLL接口传递照片路径-->接收处理返回值-->写入数据 ...
- Sum It Up -- 深搜 ---较难
每一行都是一组测试案例 第一个数字 表示总和 第二个数字表示 一共有几个可用数据 现在 按照从小到大的顺序 输出 那些数字中若干数字之和为总和的 信息 /. 很好很明显的 遍历痕迹 , ...
- HDU 5306 吉司机线段树
思路: 后面nlogn的部分是伪证... 大家可以构造数据证明是这是nlog^2n的啊~ 吉老司机翻车了 //By SiriusRen #include <cstdio> #include ...
- NOIP真题汇总
想想在NOIP前总得做做真题吧,于是长达一个月的刷题开始了 涉及2008-2016年大部分题目 NOIP [2008] 4/4 1.传纸条:清真的三维DP 2.笨小猴:字符串模拟 3.火柴棒等式:打表 ...