A题:
直接暴力,或者打表提交代码都行。需要注意的是为0的时候答案是为1的。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6;
int n,num[11],ans[8];
void Init()
{
ans[0]=1;
for(int k=1;k<=maxn;k++)
{
int cnt=0,val=k;
while(val)
{
num[cnt++]=val%10;
val/=10;
}
bool is=true;
for(int i=0,j=cnt-1;i<j;i++,j--)
if(num[i]!=num[j])
{
is=false;
break;
}
if(is)
{
//printf("IIII %d\n",k);
if(!num[0])
{
is=false;
}
for(int i=1;i<cnt/2;i++)
if(!num[i]||num[i-1]>=num[i])
{
is=false;
break;
}
if(is)
{
if(cnt&1)
{
if(num[cnt/2]==num[cnt/2-1]||!num[cnt/2]||num[cnt/2]<=num[cnt/2-1])
is=false;
}
}
}
if(is)
{
if(k<=10)
ans[1]++;
else if(k<=100)
ans[2]++;
else if(k<=1000)
ans[3]++;
else if(k<=10000)
ans[4]++;
else if(k<=100000)
ans[5]++;
else if(k<=1000000)
ans[6]++;
}
}
for(int i=2;i<=6;i++)
ans[i]+=ans[i-1];
}
int main()
{
Init();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d\n",ans[n]);
}
return 0;
}
B题:
无限冤枉的一个题,比赛开始想复杂了,后来想出可以逆推,然后写出来了发现跟我刚写的数据对比是对的(因为我想成了快速幂了,所以一直WA),唉,赛后发现自己犯的这个2B的错误,改了交上去就AC了。补充:因为是一一映射的所以可以逆推回去,然后统计有多少次平方操作,然后直接计算即可。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+100;
const int mod=1e9+7;
int n,m,p[maxn];
long long QuickMode(int c,int n)
{
long long val=c;
for(int i=0;i<n;i++)
val=(val*val)%mod;
return val;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int cnt=0;
for(int i=0;i<m;i++)
{
char op[5];
int c;
scanf("%s%d",&op,&c);
if(op[0]=='O')
p[cnt++]=c;
else
{
int k=0,pos=c;
for(int j=cnt-1;j>=0;j--)
{
if(p[j]==3)
k++;
else if(p[j]==2)
{
pos=n+1-pos;
}
else
{
if(pos<=(n+1)/2)
pos=(pos-1)*2+1;
else
pos=(pos-(n+1)/2)*2;
}
//printf("Pos %d %d\n",p[j],pos);
}
printf("%I64d\n",QuickMode(pos,k));
}
}
}
return 0;
}
C题:
题目的M就是为了来算N的范围的,而我又粗心了一次。对于M首先可以发现n最多就为m个(n全为1的情况,我在这里wa了几次,把数组变大后就AC了)。然后就类似于题解上说的那样进行DP操作,其实就是一个单调性的关系,所以把n^3降为n^2
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=3e3+100;
int n,m,a[maxn*1000],b[maxn*1000],dp[maxn][maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
for(int i=0;i<n;i++)
b[i]=a[i];
int cnt=unique(b,b+n)-b,ans=0;
memset(dp,0,sizeof(dp));
for(int i=0;i<cnt;i++)
{
dp[i][i]=upper_bound(a,a+n,b[i])-lower_bound(a,a+n,b[i]);
ans=max(ans,dp[i][i]);
}
for(int i=0;i<cnt;i++)
{
int k=i;
for(int j=i+1;j<cnt;j++)
{
dp[i][j]=max(dp[i][j],dp[i][j-1]);
while(k>=0&&b[j]-b[i]>=b[i]-b[k])
{
dp[i][j]=max(dp[i][j],dp[k--][i]+1);
//printf("DPPP %d %d %d %d\n",i,j,k+1,dp[k+1][i]+1);
}
//printf("III %d %d %d %d\n",i,j,k,dp[i][j]);
ans=max(ans,dp[i][j]);
}
}
printf("%d\n",ans);
}
return 0;
}