PAT 乙级B1040 有几个PAT?

↘锁芯ラ 提交于 2019-12-18 00:34:42

暴力必超时。

思路很简单:

循环遍历字符串数组,对于每个‘A’,其能组成的PAT个数,取决于左边的'P'的个数和其右边的‘T’的个数,乘起来累加求和即可得出最终解。

该算法两次遍历数组,复杂度为O(n),耗时6ms。

第一次遍历是要求出数组中T的个数,

第二次遍历就是正式的计算。

计算方式:如果是‘P’,那么P的数量(最开始是0)加1,

                  如果是‘T’,那么T的数量(第一次遍历已算出)减一,

                  如果是‘A’,则用T的数量 * P的数量,累加到result上。

#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

#define num 1000000007

int main()
{
    int p_count,t_count,result;
    p_count = t_count = result = 0;
    char str[100010];
    scanf("%s",str);
    int len = strlen(str);

    for(int i=0;i<len;i++)
    {
        if(str[i] == 'T')//求T的个数
            t_count++;
    }

    for(int i=0;i<len;i++)
    {
        if(str[i] =='P')
            p_count++;
        else if(str[i] == 'T')
            t_count--;
        else
        {
             result += p_count*t_count;
             result = result % num;
        }
    }

    printf("%d",result);
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!