Codeforces Round #568 (Div. 2) D. Extra Element

链接:

https://codeforces.com/contest/1185/problem/D

题意:

A sequence a1,a2,…,ak is called an arithmetic progression if for each i from 1 to k elements satisfy the condition ai=a1+c⋅(i−1) for some fixed c.

For example, these five sequences are arithmetic progressions: [5,7,9,11], [101], [101,100,99], [13,97] and [5,5,5,5,5]. And these four sequences aren't arithmetic progressions: [3,1,2], [1,2,4,8], [1,−1,1,−1] and [1,2,3,3,3].

You are given a sequence of integers b1,b2,…,bn. Find any index j (1≤j≤n), such that if you delete bj from the sequence, you can reorder the remaining n−1 elements, so that you will get an arithmetic progression. If there is no such index, output the number -1.

思路:

排序后,先检测一开头,或者以结尾开始检测,不满足等差数列跳过,判断跳过了几个,大于1则不能。

代码:

#include <bits/stdc++.h>
using namespace std;
 
typedef long long LL;
const int MAXN = 2e5+10;
int a[MAXN];
map<int, int> Mp;
int n;
 
int Check(int fir, int sub)
{
    int cnt = 0;
    int res = Mp[a[1]];
    for (int i = 1;i <= n;i++)
    {
        if (a[i] != fir)
        {
            cnt++;
            res = Mp[a[i]];
        }
        else
            fir += sub;
    }
    if (cnt > 1)
        return -1;
    else
        return res;
}
 
int main()
{
    cin >> n;
    for (int i = 1;i <= n;i++)
        cin >> a[i], Mp[a[i]] = i;
    sort(a+1, a+1+n);
    if (n <= 3)
    {
        cout << 1 << endl;
        return 0;
    }
    int res1 = Check(a[1], a[2]-a[1]);
 
    int res2 = Check(a[n]-(n-2)*(a[n]-a[n-1]), a[n]-a[n-1]);
    if (res1 != -1)
        cout << res1 << endl;
    else if (res2 != -1)
        cout << res2 << endl;
    else
        cout << -1 << endl;
 
    return 0;
}
posted @ 2019-07-09 09:35  YDDDD  阅读(233)  评论(0编辑  收藏  举报