【atcoder beginner 109#c】"读书太少,想法太多" /-------- 思路要明白,一步错步步错,改动亦然。

版权声明:版权所有……啊重点是我简直找不到第二个人写比我还多的吐槽-。- https://blog.csdn.net/StrongerIrene/article/details/82732627

先一些题外话--..

Notice(精简)

(1)变量重名了,有可能会让map用不来,那是因为你先cin了一个m。。。

(2)0x3f3f3f3f有四个,我的分。。

atcoder一场。           。。。竟然是因为endl。。。 感觉不打的话水平真的会下降啊。。

好了,疯狂错不止,结果不是set里面,而是for循环少写了。

怎么这么一丁点东西,会错这么严重?仅仅是因为是和数字相关的吗?

有一个重要的原因就是,发现错了之后,我只是在进行简单的修补,并没有重新思考。

这也是很多情况下一错再错的原因吧。。

【经过思考】---还不断告诉自己这是修炼的过程....

随后想到: 先排序看24  48(插入x之后看一堆间距是否符合) 如果最小的能满足就找大的去 如果不行就在剩下的地方二分。

【经过题解】其实要转换成数学啊,【就是---】每个点距离x的最大公约数。

然后每次都gcd一下其实就可以解决了(从h=gcd(b[0],b[1])开始...) 因为我们其实只要一个gcd的答案-.-

大概就是修养吧,300分的难度

再来复习一下:int GCD(int a,int b){return b==0?a:GCD(b,a%b);}

int gcd(int a,int b) {return b==0?a:gcd(b,a%b);}

【再其实】思路被卡死了啊。。完全没往数学想了。。

经过我的分析。可能题目会给一些误解

显而易见的是:题目中-> 看起来和起始点无关,和这个点到x的位置有关。

那么有一些错误的方向是----把x当做一个点插进去、直接计算a[i-1]  a[i] 

第一个暂且不说,第二个其实可以和a[i]到x的距离合并了.....

想问题真的要想全啊吧........ 

1其实需要什么呢,分析能分析得来,的确是要找能除得尽的那些&……%¥#@

最开始想能除得尽的用二分来做,肯定有的是不满足的。(12可以,24可以,二分会把中间也分到,于是就错掉了)

那就前面间距当标签,12不满足 ,1 2总可以吧,上面实验,下面二分

其实这里应该想一个往数学方面的转化,就是那个最大公约数。

这已经不是在无规律的试探底线合适范围了,增加的规律有倍数,可以试试数学。

我最后写了个代码。【我也不知道这样是在干嘛……总之练练脑子吧,各种,各种解决问题的能力】/哪怕是用来小小的证明寄几(?)


#include<iostream>
#include<algorithm>
using namespace std;
int n,x;
const int maxn=100005;
int a[maxn];
int d[maxn];
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
int main(){
	cin>>n>>x;
	int aa;
	for(int i=1;i<=n;i++){
		cin>>aa;
		d[i]=abs(aa-x);//只要差值,gcd
	}
	if(n==1)cout<<abs(x-aa)<<endl;
	else{
	int h=gcd(d[1],d[2]);
	for(int i=3;i<=n;i++){
		h=gcd(h,d[i]);
	}
	cout<<h<<endl;
	}
	return 0;
}

emmm,别忘了abs
 

18-9-28

-----------以下为转载知识点 https://blog.csdn.net/L_apple8/article/details/52525752

  • 0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
  • 另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。
  • 最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。

猜你喜欢

转载自blog.csdn.net/StrongerIrene/article/details/82732627
今日推荐