题目:1040 有几个PAT (25 分)
思路:
- 是个规律题,只要找到规律就有思路,那代码基本就有了,就是怎么实现比较好和是否简洁的问题。
- 很明显:A是分水岭,A前面有多少个P和A后面有多少个T知道的话,那有几个PAT就是P的个数*T的个数的问题了。
- 总个数为前面所有A所在位置能构成的PAT数+现在A所在位置能构成的PAT数。
- 详情代码。
代码:
1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <sstream>
5 #include <cmath>
6 #include <algorithm>
7 #include <string>
8 #include <stack>
9 #include <queue>
10 #include <vector>
11 #include <map>
12 using namespace std;
13 const int mod = 1000000007;
14
15 int main()
16 {
17 string s;
18 cin >> s;
19 int cntt = 0, cntp = 0, sum = 0;
20 for(int i = 0; i < s.length(); i++)
21 {
22 if(s[i] == 'T') //先记录全部的T的个数
23 cntt++;
24 }
25 for(int i = 0; i < s.length(); i++)
26 {
27 if(s[i] == 'P') //记录A前的P的个数
28 cntp++;
29 else if(s[i] == 'T') //A前的T没用,减去
30 cntt--;
31 else if(s[i] == 'A') //一旦遇到A,此时的P和T的个数就是满足条件的,进行计算
32 sum = (sum + cntp * cntt) % mod;
33 }
34 printf("%d", sum);
35 return 0;
36 }
总结:
找规律题,规律是一下就找到了,但是找到方法去实现代码也很重要。