首页 > 试题广场 >

等差数列

[编程题]等差数列
  • 热度指数:36611 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
如果一个数列S满足对于所有的合法的i,都有S[i + 1] = S[i] + d, 这里的d也可以是负数和零,我们就称数列S为等差数列。
小易现在有一个长度为n的数列x,小易想把x变为一个等差数列。小易允许在数列上做交换任意两个位置的数值的操作,并且交换操作允许交换多次。但是有些数列通过交换还是不能变成等差数列,小易需要判别一个数列是否能通过交换操作变成等差数列

输入描述:
输入包括两行,第一行包含整数n(2 ≤ n ≤ 50),即数列的长度。
第二行n个元素x[i](0 ≤ x[i] ≤ 1000),即数列中的每个整数。


输出描述:
如果可以变成等差数列输出"Possible",否则输出"Impossible"。
示例1

输入

3
3 1 2

输出

Possible

//输入一个数字表示数组的长度,再依次输入数组的每一个元素,采纳率最高的那个答案不全面,在测试用例的通过率只有80%

import java.util.Scanner;
import java.util.Arrays;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int num = in.nextInt();
        int[] arr = new int[num];
        for(int i = 0; i < num ;i++){
            arr[i] = in.nextInt();
        }
        Arrays.sort(arr);
        //需要定义一个布尔变量标记是否成功
        boolean flag = true;
        int d = arr[1] - arr[0];
        for(int i = 2;i<arr.length;i++){
            if(arr[i] - arr[i-1] != d){

                flag = false;
            }
        }
        if(flag){
            System.out.println("Possible");
        }else{
            System.out.println("Impossible");
        }

    }
}
发表于 2017-08-31 16:02:27 回复(5)
/*
 *时间复杂度O(n),空间复杂度O(n)
 *1、找到等差数列的差值dif
 *2、判断每个数对应差值dif的倍数(arr-min)/dif
 */
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = Integer.valueOf(sc.nextLine());
		int[] arr = new int[n];
		int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
		String[] str = sc.nextLine().split(" ");
		for (int i = 0; i < n; i++) {
			arr[i] = Integer.valueOf(str[i]);
			min = arr[i] > min ? min : arr[i];
			max = arr[i] < max ? max : arr[i];
		}
		if (min == max) {
			System.out.println("Possible");
			return;
		}
		int dif = (max - min) / (n - 1);
		for (int i = 0; i < n; i++) {
			int tmp = (max - Math.abs(arr[i])) / dif;
			if (tmp < 0 || tmp >= n) {
				System.out.println("Impossible");
				return;
			}
			arr[tmp] = -Math.abs(arr[tmp]);
		}
		for (int i : arr) {
			if (i > 0) {
				System.out.println("Impossible");
				return;
			}
		}
		System.out.println("Possible");
	}

}

编辑于 2017-08-14 21:06:31 回复(5)
/*排序判断是否差值相同*/
#include <iostream>
#include<algorithm>
using namespace std;
int num[51];
int main()
{
    int n,i,flag=1;
    cin>>n;
    for(i=0;i<n;++i)
        cin>>num[i];
    sort(num,num+n);
    if(n<=2) cout<<"Possible";
    if(n>2)
    {
        for(i=0;i<n-2;++i)
          if(num[i]-num[i+1]!=num[i+1]-num[i+2]) {cout<<"Impossible";flag=0;break;}
        if(flag) cout<<"Possible";
    }
    return 0;
}

发表于 2019-03-20 18:54:34 回复(0)

python两行

length, arr = int(input()), sorted(list(map(int, input().split())))
print("Possible" if len(set(map(lambda c: arr[c + 1] - arr[c], range(length - 1)))) == 1 else "Impossible")

思路:

  1. 先对输入的数组进行排序。
  2. 记录数组中两两相邻的差值,将差值放到一个数组里。
  3. 如果是等差数列,那么这个差值全部为同一个数。既len(set(该数组)) == 1。
编辑于 2019-02-24 15:39:36 回复(6)
这一题最简单的解法是排个序然后判断过去一遍就可以知道,但时间复杂度提升了一个量级到nlogn。更好的做法是空间换时间使复杂度降到n。
方法是取第一第二小的数,如果等差数列则任意arr[i]-min 必然可以被等差值d=min2-min整除且不重复,再用一个数组存索引保证不重复,就可以两遍循环解决这个问题。
import java.util.Scanner;
 
public class Main {//两遍循环,时间复杂度0(n)  AC代码
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        String flag="Possible";
        int min=2147483646;
        int min2=2147483647;
        int []arr=new int[n];
        int []index=new int [n];//空间换时间
        int i=0;
        for(i=0;i<n;i++){//第一遍循环录入数据的同时取第一第二小数
            arr[i]=sc.nextInt();
            if(arr[i]<min){
                min2=min;
                min=arr[i];}
            else if(arr[i]<min2)min2=arr[i];
            if(i>0){if(arr[i]!=arr[i-1])flag="Impossible";}//所有数全等才直接possible
        }
        int d=min2-min;//获取等差值
        if(d!=0){
            for(i=0;i<n;i++){
            if((arr[i]-min)%d!=0)break;//不符合等差
            else if((arr[i]-min)/d>=n)break;//等差值超倍
            else if(index[(arr[i]-min)/d]==1)break;//数据存在重复
            else {index[(arr[i]-min)/d]=1;
                 if(i==n-1)flag="Possible";
                 }
            }
       }
        System.out.println(flag);
    }
}

发表于 2019-02-15 16:34:31 回复(9)

给的样例极限长度是50 所以先排序是绝对不会超时的 nlog(n)的复杂度1s内大概能处理n < 10^6-10^7的数量级

#include<iostream>
#include<algorithm>

using namespace std;
const int maxn = 51;
int arr[maxn], n;

int main(){
    cin>>n;
    int flag = 1;
    for(int i=0;i<n;i++) scanf("%d", &arr[i]);
    sort(arr, arr+n);
    if(n > 2){
        int cha = arr[1] - arr[0];
        for(int i=2;i<n;i++){
            if(arr[i]-arr[i-1] != cha) {flag=0; break;}
        }
    }
    if(flag) cout<<"Possible"<<endl;
    else cout<<"Impossible"<<endl;
}
发表于 2019-03-01 20:45:04 回复(0)
首先需要排序,排序好了以后需要用到二分搜查的思路,为了省时间从两边开始判断,先定义一个d,d=数组里面的任何一个数减去它前面的数,然后从两边开始判断前后两个数的差是否跟d相等就完事儿了
import java.util.*;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner (System.in);
		int n=cin.nextInt();//数组长度;
		int a[]=new int[n];
		for(int i=0;i<n;i++) {
			a[i]=cin.nextInt();
		}
		Arrays.sort(a);
		int left=1;
		int right=n-1;
		int temp=a[1]-a[0];
		int x=0;
		while (left<=right) {
			if(a[left]-a[left-1] !=temp || a[right]-a[right-1] !=temp) {
				x=1;
				break;
			}
			left++;
			right--;
			
		}
		if(x==0)System.out.print("Possible");
		else if(x==1)System.out.print("Impossible");

	}

}

发表于 2019-11-04 16:22:01 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        try(Scanner in = new Scanner(System.in)){
            int n = Integer.parseInt(in.nextLine()),i = 0;
            int[] a = new int[n];
            while(in.hasNextInt()){
                a[i++] = in.nextInt();
            }
            System.out.println(helper(a));
        }
    }
    public static String helper(int[] a){
        Arrays.sort(a);
        int d = a[1] - a[0],i = 2;
        while(i < a.length){
            if(a[i] - a[i - 1] != d) return "Impossible";
            i++;
        }
        return "Possible";
    }
}


发表于 2019-01-12 14:02:06 回复(0)
#!/usr/bin/env python
#-*- coding:utf8 -*-
def isOK(n, nums):
    nums = sorted(nums)
    Max = nums[1] - nums[0]
    for i in range(1, n):
        if nums[i] - nums[i-1] != Max:
            return False
    return True
 
if __name__ == '__main__':
    n = input()
    nums = map(int, raw_input().split())
    if isOK(n, nums):
        print 'Possible'
    else:
        print 'Impossible'
发表于 2017-08-13 15:08:12 回复(0)
//C++ 先用sort排序 然后判断后续数列相邻两个数之间的差值是否相等
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
int jianju;
int x[100];
cin>>n;
for(int i=0;i<n;i++)
{
cin>> x[i];
}
sort(x,x+n);
int chazhi;
chazhi=x[1]-x[0];//等差数列差值
for(int j=0;j<n-1;j++)
{
jianju=x[j+1]-x[j];
if(jianju!=chazhi)
{
cout<<"Impossible"<<endl;
return0;
}
}
cout<<"Possible"<<endl;
return0;
}

编辑于 2017-08-17 15:32:21 回复(0)
java语言。先排序,然后判断相邻元素的差值是否相等。其中排序可以直接使用Arrays.sort()方法,
我这里顺便复习一下快排。有错误欢迎指正,非常感谢!
importjava.util.*; 
publicclassMain{ 
       
    publicstaticvoidmain(String[] args){ 
        Scanner in = newScanner(System.in); 
        while(in.hasNext()){ 
            intnum = in.nextInt();
            in.nextLine();
            int[] a = newint[num];
            for(inti=0;i<num;i++){     //读取数列元素
                a[i] = in.nextInt();
            }
            QuickSort(a,0,num-1);     //排序,可直接使用Arrays.sort(a);代替
            intcha = a[1]-a[0];
            booleanb = true;
            for(inti=2;i<num;i++){             //判断相邻元素的查找是否相等
                if(a[i]-a[i-1] != cha){
                    System.out.println("Impossible");
                    b = false;
                }
            }
            if(b)
                System.out.println("Possible");
        } 
    } 
    publicstaticvoidQuickSort(int[] a ,intstart, intend){     //快排
        ints = start;
        inte = end;
        if(start<end){
            intnum = a[start];
            while(s<e){
                while(s<e && a[e]>=num){
                    e--;
                }
                if(s<e){
                    a[s++] = a[e];
                }
                while(s<e && a[s]<=num){
                    s++;
                }
                if(s<e){
                    a[e--] = a[s];
                }
            }
            a[s] = num;
            QuickSort(a,start,s-1);
            QuickSort(a,s+1,end);
        }
    }
}
发表于 2017-08-12 22:56:11 回复(2)
检查一下排序后是不是等差数列就可以了
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());
        String[] strSeq = br.readLine().trim().split(" ");
        int[] seq = new int[n];
        for(int i = 0; i < n; i++) seq[i] = Integer.parseInt(strSeq[i]);
        Arrays.sort(seq);
        int d = seq[1] - seq[0];
        for(int i = 2; i < n; i++){
            if(seq[i] - seq[i - 1] != d){
                System.out.println("Impossible");
                return;
            }
        }
        System.out.println("Possible");
    }
}


发表于 2021-03-20 13:36:43 回复(0)
解法1:排序,两两比较
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;   int main() {     int n,mid,num;     vector<int> eql;     cin>>n;     num=n;     if(n==2)     {         cout<<"Possible"<<endl;         return 0;     }     while(n--)     {         cin>>mid;         eql.push_back(mid);     }     sort(eql.begin(),eql.end());       bool eq=true;           for(int i=0;i<num-2;i++)     {         if(eql[i+2]-eql[i+1]!=eql[i+1]-eql[i])         {             eq=false;             cout<<"Impossible"<<endl;             break;         }     }     if(eq==true)     {         cout<<"Possible"<<endl;     }     return 0; } 解法2: 思路:1.先求出数列的最大,最小值 max min
2.判断max-min的差值对n-1取余是否为0 若不为0,则不是等差数列 若为0,则继续判断 3.求出数列的差值eql=(max-min)/n-1 若数列为等差数列,则每一项减去最小值对差值eql取余一定等于0 #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() {     int n,mid,max=0,min=1000;     cin>>n;     vector<int> vec;     for(int i=0;i<n;i++)     {         cin>>mid;         vec.push_back(mid);     }     for(int i=0;i<n;i++)     {                  if(vec[i]>max)         {             max=vec[i];         }         else if(vec[i]<min)         {             min=vec[i];         }     }     if (max==min)     {         cout<<"Possible"<<endl ;         return 0;     }     int eq=(max-min)%(n-1);     if(eq!=0)     {         cout<<"Impossible"<<endl ;         return 0;     }     int eql=(max-min)/(n-1);     bool flag=true;     for(int i=1;i<n;i++)     {         if((vec[i]-min)%eql!=0)         {              cout<<"Impossible"<<endl;              flag=false;              break;         }     }     if(flag)     {          cout<<"Possible"<<endl;     }     return 0; }

编辑于 2019-05-29 21:57:45 回复(0)

python 多行

  1. 逆排序,L[1] - L[0]为差,循环看是否满足差,不满足则退出循环
mylen = int(input())
L = list(map(int,input().split()))
L.sort(reverse = True)

cha = L[1]-L[0]
flag = True
for i in range(1,mylen):
    if L[i]-L[i-1]!=cha:
        flag = False
        break
if flag:
    print("Possible")
else:
    print("Impossible")

发表于 2019-04-16 23:56:39 回复(0)
##Python

n=int(input())
s=list(map(int,input().split()))
s.sort()
diff=[]
for i in range(n-1):
    diff.append(s[i+1]-s[i])
if len(set(diff))==1:
    print("Possible")
else:
    print("Impossible")

发表于 2019-03-16 19:57:08 回复(0)
def grade(n, l):
    l = sorted(l)   # 先对序列排序
    t = l[0]-l[1]
    for i in range(1, n):
        if l[i-1] - l[i] != t:  # 相邻两个数的差不相同的话
            return 'Impossible'
    else:
        return 'Possible'

if __name__ == "__main__":
    n = int(input())
    l = list(map(int, input().split()))
    print(grade(n, l))

发表于 2019-03-12 22:16:43 回复(0)
对输入数列排序,分别算差值,如果差值都相同,则说明可以变换为等差数列
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n;
    cin>>n;
    int* a=new int[n];
    for(int i=0;i<n;i++)
        cin>>a[i];
    sort(a,a+n);
    if(n==2)
        cout<<"Possible"<<endl;
    else{
        bool judge=1;
        for(int i=0;i<n-2;i++){
            if(a[i+1]-a[i]!=a[i+2]-a[i+1]){
                judge=0;
                break;
            }
        }
        if(judge)
            cout<<"Possible"<<endl;
        else 
            cout<<"Impossible"<<endl;
    }
}

发表于 2019-03-04 23:17:35 回复(0)
Python版:第一次没有报错,略微感动
def pd(new_m,d):
    for j in range(n-1):
        if new_m[j]-new_m[j+1]!=d:
            return 0
    return 1

n=int(input());
m=[int(n) for n in input().split()];
new_m=sorted(m,reverse=True);
d=new_m[n-2]-new_m[n-1];
c=pd(new_m,d);
if c==1:
    print("Possible")
else:
    print("Impossible")

发表于 2019-03-02 19:46:33 回复(1)
使用了C++ STL的两个算法:sort 和 adjacent_find
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char **argv)
{
    int n;
    cin >> n;
    vector<int> vec(n);
    for(int & c: vec)
        cin >> c;
    sort(vec.begin(), vec.end());
    int diff = vec[0]-vec[1];
    auto pos = adjacent_find(vec.begin(), vec.end(), [diff](int a, int b){return diff != (a-b);});
    if(pos != vec.end())
        cout << "Impossible" << endl;
    else
        cout << "Possible" << endl;
    return 0;
}

发表于 2019-02-19 17:21:20 回复(0)
#include <bits/stdc++.h>

using namespace std;

int main()
{     int n;     while(cin>>n){         int a[n];         for(int i=0;i<n;i++)             cin>>a[i];         sort(a,a+n);         bool flag = true;         for(int i=2,d=a[1]-a[0];i<n;i++)             if(a[i]-a[i-1]!=d){                 cout<<"Impossible"<<endl;                 flag = false;                 break;             }         if(flag)             cout<<"Possible"<<endl;     }     return 0;
}

发表于 2019-02-07 01:17:12 回复(0)