1.互不相同的一组数字的某个排列是等差数列,那么这个排列一定是从小到大或从大到小的排列
证明:除去从小到大或从大到小这两种排列,其它排列都会导致两个相邻数字之间的差出现正负两种情况
这说明要判断互不相同的一组数字的全排列中是否存在等差数列,只需要判断从小到大或从大到小的排列即可。而从小到大的排列是等差数列当且仅当从大到小的排列是等差数列,两者只是公差差了一个符号。更进一步,要判断互不相同的一组数字的全排列中是否存在等差数列,只需要判断从小到大的排列即可
2.有两个相同数字的一组数字存在某个排列是等差数列,那么这组数字必须全部相同
证明:由于这组数字存在某个排列是等差数列,对于数组中这两个相同数字a来说。假设它们在排列中的位置分别在第s位和第t位,如下所示
( ) ... ( ) a ( ) ... ( ) a ( ) ... ( )
假设公差是d,则a+(t-s)d=a,得出d=0,因此这组数字全部都是数字a
3.一组数字从小到大的排列不是等差数列,则这组数字的任何排列都不是等差数列
证明:若这组数组存在某个排列是等差数列
1.这组数组的数字互不相同,则这个排列一定是从小到大或从大到小的排列。而从小到大的排列不是等差数列,那只能是从大到小的排列是等差数列,但是从小到大的排列是等差数列当且仅当从大到小的排列是等差数列,矛盾
2.这组数组有两个数字相同,则这组数字必须全部相同,那从小到大的排列是公差为0的等差数列,矛盾
参考代码:
#include#includeusing namespace std; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int m; scanf("%d",&m); int *s=(int *)malloc(m*sizeof(int)); for(int i=0;i<m;i++) scanf("%d",&s[i]); sort(s,s+m); int d=s[1]-s[0],judge=1; for(int i=1;i<m;i++) if(s[i]-s[i-1]!=d) { judge=0; break; } if(judge==1) printf("yes\n"); else printf("no\n"); free(s); } }
0.0分
0 人评分