【算法】等差數列——2017網易校招機試題

如果一個數列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

 

輸出例子1:

Possible
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
	int n = 0;
	//int elem[50] = {0};
	int x = 0;
	vector<int> vec;
	while(cin >> n){
		vec.clear();
		for(int i = 0; i < n; ++i){
			cin >> x;
			vec.push_back(x);
		}

		sort(vec.begin(), vec.end());
		int nMin = vec[0];
		int nMax = vec[n - 1];
		//int nSum = elem[0];

		//for(int i = 1; i < n; ++i){
		//	if(elem[i] < nMin)
		//		nMin = elem[i];
		//	if(elem[i] > nMax)
		//		nMax = elem[i];
		//	nSum += elem[i];

		//}

		//if(((nMin + nMax) * n) / 2 != nSum){
		//	cout << "Impossible" << endl;
		//	continue;
		//}
		int nValue = (nMax - nMin) / (n - 1);
		for(int i = 0; i < n; ++i){
			int nElem = nMin + i * nValue;
			if(find(vec.begin(), vec.end(), nElem) != vec.end()){
				if(i == n - 1){
					cout << "Possible" << endl;
				}
				continue;
			}
			else{
				cout << "Impossible" << endl;
				break;
			}
		}

	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章