今天,你ak了吗?①

摘要:
b+3);使用namespacestd;a+3);b+3);abs(a[1]-a[2]))<使用namespacestd;sizeof(aa));aa[9]==0&a) ;}for(longlongenti=0;=c;boolflag=false;=0)printf(“0*0=0\n”);}x=i;++j) bb[j]=0;aa[x%10]){flag=true;
大家好,欢迎来到今天你ak了吗系列,我是解说员,***。

先上题


今天,你ak了吗?①第1张

今天,你ak了吗?①第2张

今天,你ak了吗?①第3张

今天,你ak了吗?①第4张

今天,你ak了吗?①第5张

今天,你ak了吗?①第6张

今天,你ak了吗?①第7张

今天,你ak了吗?①第8张

今天,你ak了吗?①第9张

第一题很简单,让我们来康康。
他说,输入x和y,这是两地的位置,输入a和b,这是缆车的位置。要坐缆车从一地到另一地,求最短路。将靠的近的地方和缆车的距离算一下,再讲得到的距离加一下,就ok了!
代码:

#include<bits/stdc++.h>
using namespace std;
int a[3],b[3];
int main()
{
	scanf("%d%d%d%d",&a[1],&a[2],&b[1],&b[2]);
	sort(a+1,a+3);
	sort(b+1,b+3);
	cout<<abs(a[1]-b[1])+abs(a[2]-b[2])<<endl;
	return 0;
}

然后就欢乐地
今天,你ak了吗?①第10张
为什么会wa掉5个点呢?我们要考虑一下这个问题。如果两个缆车到离它最近的地点综合比两点之间距离还要长咋办?如下:
输入:

86 84 15 78

你跑老远8m再坐缆车过去,下车后再跑69m莫不是*****了?还不如直接走路2m更划算,所以再加一个min函数就ok。代码:

using namespace std;
#include<bits/stdc++.h>
int a[3],b[3];
int main()
{
	scanf("%d%d%d%d",&a[1],&a[2],&b[1],&b[2]);
	sort(a+1,a+3);
	sort(b+1,b+3);
	cout<<min(abs(a[1]-b[1])+abs(a[2]-b[2]),abs(a[1]-a[2]))<<endl;
	return 0;
}

第二题稍微有亿点点难度,它的优化有一些复杂。先上代码:

#include<bits/stdc++.h>
using namespace std;
long long int a,b,c,d,ans;
long long int aa[1001];
int main()
{
	scanf("%lld",&a);
	while(a!=0)
	{
		memset(aa,0,sizeof(aa));c=1;
		while(a!=0)
		{
			aa[a%10]++;
			a/=10;c*=10;
		}
		if(aa[1]==0&&aa[4]==0&&aa[5]==0&&aa[6]==0&&aa[9]==0&&aa[0]==0)
		{
			scanf("%lld",&a);
			continue;
		}
		for(long long int i=0;i*i<=c;++i)
		{
			long long int x=i*i,bb[10]={0,0,0,0,0,0,0,0,0,0};bool flag=false;
			if(x%10==2||x%10==3||x%10==7||x%10==8) continue;
			if(i==0)
			{
				if(aa[0]!=0) printf("0 * 0 = 0\n");
				continue;
			}
			while(x!=0)
			{
				bb[x%10]++;
				if(bb[x%10]>aa[x%10])
				{
					flag=true;
					break;
				}
				x/=10;
			}
			x=i;
			for(int j=0;j<=9;++j) bb[j]=0;
			if(flag==true) continue;
			while(x!=0)
			{
				bb[x%10]++;
				if(bb[x%10]>aa[x%10])
				{
					flag=true;
					break;
				}
				x/=10;
			}
			if(flag==true) continue;
			printf("%lld * %lld = %lld\n",i,i,i*i);
		}
		scanf("%lld",&a);
	}
	return 0;
}

首先.
其中,这里有一个很女少的优化,只有大佬才会
看这里

if(aa[1]==0&&aa[4]==0&&aa[5]==0&&aa[6]==0&&aa[9]==0&&aa[0]==0)
		{
			scanf("%lld",&a);
			continue;
		}

这是干什么用的呢?我们看一组数据就懂了。


一位数它的平方平方后的个位
000
111
244
399
4166
5255
6366
7499
8644
9811

我们可以发现这里每个数的平方位数无非只有1、4、5、6、9、0.当那一组数中不含有这几个数,可以直接continue了。这不是很容易看出来吗!
没事别乱说好不好
这个循环的条件非常玄学:

i*i<=c

为什么是这样的呢?因为这个时候i的位数已经多于n了。


判断部分:

			while(x!=0)
			{
				bb[x%10]++;
				if(bb[x%10]>aa[x%10])
				{
					flag=true;
					break;
				}
				x/=10;
			}
			x=i;
			for(int j=0;j<=9;++j) bb[j]=0;
			if(flag==true) continue;
			while(x!=0)
			{
				bb[x%10]++;
				if(bb[x%10]>aa[x%10])
				{
					flag=true;
					break;
				}
				x/=10;
			}
			if(flag==true) continue;
			printf("%lld * %lld = %lld\n",i,i,i*i);
		}

解释变量:bb[i]:表示i在x(枚举到的数的平方)中出现了bb[i]次

  • aa[i]表示i在a(题目给的数据)中出现了aa[i]次
    变量解释完是不是就一目了然了
    哪有!看不懂!
    就你看不懂~~
    好吧,既然看不懂,那我就解释一下
    第一个while查平方后de枚举数,第二个while查i是否合法。你仔细看,对比下:

今天,你ak了吗?①第11张


你品,你细品~~
被圈起来的地方(就是while里面的内容)是不是完全一样?不一样的在被黄色荧光笔涂上的赋值的语句。
好了,这道题就算讲解完毕,下一道题!!!

未完待续

还没有学会的戳这(某dalao的题解)

免责声明:文章转载自《今天,你ak了吗?①》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux之/etc/fstab自动挂载文件讲解AWS系列-Amazon Simple Notification Service (SNS)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS NSString 截取字符串(根据索引截取)

1. rangeOfString:截取指定字符串的长度; 2. substringToIndex:7:截取从0 索引到指定索引(7)长度的字符串 (从0到7)3. substringFromIndex:9:截取从指定索引(9)到末尾长度的字符串  (从9到0)4. substringWithRange:NSMakeRange(4,2):截取从指定索引(4)...

ORA-00604的解决方法

分类: Oracle 从错误的角度可以推出:应该是表空间不足   根据查看表空间的使用情况: select b.file_name 物理文件名, b.tablespace_name 表空间, b.bytes/1024/1024 大小M, (b.bytes-sum(nvl(a.bytes,0)))/1024/1024 已使用M, substr((b.by...

[OpenCVsharp]利用指针实现高速访问像素RGB值

先简单介绍下什么是OpenCVsharp,内容取自百度百科 OpenCvSharp是一个OpenCV的.Net wrapper,应用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV,有详细的使用样例供参考。该库采用LGPL发行,对商业应用友好。使用OpenCvSharp,可用C#,VB.NET等语言实现多种流行的图像处理(image...

Vigenère 密码NOIP 2012 提高组 第一天 第一题

题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用。 在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用 C 表示;而密钥是一种参数,是将明文转换为密文或...

Java 读取ANSI文件中文乱码问题解决方式[转]

第一步:首先判断源文件的编码格式: 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文操作系统,如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,只要判定两种常见的编码就可以了:GBK和UTF-8。...

tf.GradientTape() 使用

import tensorflow as tfw = tf.constant(1.)x = tf.constant(2.)y = x*wwith tf.GradientTape() as tape: tape.watch([w]) y2 = x*wgrad1 = tape.gradient(y,[w])print(grad1)结果为[None...