题目
输入
5
001000
000000
999000
453234
654331
输出
1
0
998999
121496
470362
题意:
给出一个6个字符的串,求在这个串前面的串有多少个前三个数与后三位数差的绝对值比这个串的小.
思路:暴力,遍历每一个数前差的绝对值,运用前缀和计算出大于等于每一个绝对值的数量即可具体看代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<sstream>
#include<stack>
#include<queue>
using namespace std;
#define ll long long
int a[30];
int b[1000100][30];//在第i个数每个差的绝对值各有多少个,差的绝对值最大27
//例999000,000999
int main()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int maxx=0;
for(int i=0;i<1000000;i++)
{//999999个数
int p=i,q=6,s=0,ss=0;//q=6,总共六位数字
while(q--)
{
if(q>=3)
{
s+=p%10;
}
else
{
ss+=p%10;
}
p/=10;
}
int d=abs(s-ss);//差的绝对值
a[d]++;
for(int j=0;j<=27;j++)
b[i][j]=a[j];//存下在每个数差的绝对值各有多少个
}
for(int i=0;i<=999999;i++)
for(int j=26;j>=0;j--)
b[i][j]+=b[i][j+1];//计算出在每个数大于等于每个差的绝对值的数量
int t;
scanf("%d",&t);
while(t--)
{
char v[10];
cin>>v;
int kk=0,lll=0,hhhh=1,ssss=0;
for(int i=5;i>=0;i--)
{
if(i<3)kk+=v[i]-'0';
else lll+=v[i]-'0';
int vvv=v[i]-'0';
ssss+=vvv*hhhh;
hhhh*=10;
}
int ii=abs(kk-lll);//要求串的差的绝对值
int hhhhhhh=ssss+1-b[ssss][ii];//一共有ssss+1个数(加上000000),大于等于这个差的为b[ssss][ii],相减即为在这个数前小于这个差的绝对值的个数
printf("%d\n",hhhhhhh);
}
}