这道题我先开始是考虑了P,A,T每个字符的位置来计算,能结果正确,但因为3层循环和数组空间占比较大,运行时间超时,只得了15分。代码如下:
#include<iostream>
#include<stdio.h>
using namespace std;//要想想的简单
int p[500],a[500],t[500];
int main()
{
string s;
cin>>s;
int p1=0,a1=0,t1=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='A')
a[a1++]=i;
else if(s[i]=='P')
p[p1++]=i;
else if(s[i]=='T')
t[t1++]=i;
}
int count=0;
for(int i=0;i<t1;i++)
{
for(int j=0;j<a1;j++)
{
if(t[i]<a[j]) break;
for(int k=0;k<p1;k++)
{
if(a[j]<p[k])
{
break;
}
if(a[j]>p[k])
{
count++;
}
}
}
}
cout<<count;
return 0;
}
看见别人的算法,是比较A左边P的个数m,A右边T的个数n,将其个数相乘即可......所以算法千姿百态,效率最高的才是最好的呀。自己完全根据逻辑敲代码,结果还是运行超时,只得了15分,代码如下:
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
string str;
cin>>str;
int sum=0;
for(int i=0;i<str.length();i++)
{
int l=0,r=0;
if(str[i]=='A')
{
for(int j=0;j<i;j++)
{
if(str[j]=='P')
l++;
}
for(int k=i+1;k<str.length();k++)
{
if(str[k]=='T')
r++;
}
}
sum+=l*r;
}
cout<<sum%1000000007;
return 0;
}
看了别人的代码,才知道,效率高的算法还得另辟蹊径才行,简洁有效代码如下,你细看:
#include<iostream>
#include<stdio.h>
using namespace std;
int a[100010];
int main()
{
string str;
cin>>str;
int sum=0,t=0,p=0;
for(int i=0;i<str.length();i++)
{
if(str[i]=='T')
t++;
}
for(int i=0;i<str.length();i++)
{
if(str[i]=='A') sum=(sum+t*p)%1000000007;
else if(str[i]=='P') p++;
else if(str[i]=='T') t--;
}
cout<<sum;
return 0;
}
唉......