Gym - 101911FTickets【暴力】

题目

传送门
在这里插入图片描述

输入
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);
	
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值