P7478 【A】StickSuger 题解
P7478 【A】StickSuger
题目大意:
给一个字符数组
暴力解
骗分是作为一个oier来说的基本功,既然想不到正解,暴力骗分也是不错的...?
从大到小枚举
for(i=n-1;i>=1;--i)
{
if(maxi||maxj)break;
for(j=n;j>=i+1;--j)
{
if(S[j]>S[i])
{
maxi=i;
maxj=j;
break;
}
}
}
上述代码可以拿到51分的好成绩.
优化暴力解
看到题目中:
Subtask 1(4 points):
S 只包含一种字符。
考虑该情况:
按照原暴力思路,枚举
如果当某一个
#include <stdio.h>
char S[1000007];
int n;
int main()
{
scanf("%d%s",&n,&S[1]);
int i,j,maxi=0,maxj=0;
for(i=n-1;i>=1;--i)
{
if(maxi||maxj)break;
for(j=i+1;j<=n;++j)
{
if(S[j]>S[i])
{
maxi=i;
maxj=j;
}
}
while(S[i-1]==S[i]&&i>=1)i--;
}
if(maxi+maxj==0)puts("-1");
else printf("%d %d",maxi,maxj);
return 0;
}
该优化可以以 55ms 通过该题.
类似的思路
我们从大到小枚举
考虑该情况:
#include <stdio.h>
int n;
char S[1000007];
int main()
{
scanf("%d%s",&n,&S[1]);
int i,j,a,b,maxi=0,maxj=0;
for(j=n;j>=1;--j)
{
a=0,b=0;
for(i=j-1;i>=1;--i)
{
if(S[i]<S[j])
{
a=i;
b=j;
break;
}
if(i<=maxi)break;
}
if(a>maxi)
{
maxi=a;
maxj=b;
}
else if(a==maxi&&b>maxj)
{
maxi=a;
maxj=b;
}
while(S[j-1]==S[j]&&j>=1)
{
j--;
}
}
if(maxi+maxj==0)puts("-1");
else printf("%d %d",maxi,maxj);
return 0;
}