牛客练习赛16-B. 漂亮的树 (思维)

街上有n棵树,标号为1…n,第i棵树的高度为a
i

定义这n棵树是漂亮的,当且仅当

    1. 对于所有的i,a
i=a
n-i+1

    2. 对于1 <= i < n / 2 (不是整除),a
i + 1= a
i + 1;

比如说 “2 3 4 5 5 4 3 2”和“1 2 3 2 1”是漂亮的而“1 3 3 1”和“1 2 3 1”不是。

现在请问最少修改几棵树的高度(可以变大也可以变小),使得这些树是漂亮的。

输入描述:

第一行一个整数n表示树的数量( 1 <= n <= 100,000)。
第二行n个整数表示树的高度( 1 <= ai <= 100,000)。

输出描述:

输出一个整数表示最少修改树的高度的数目。

思路:对每棵树的高度减去下标,看哪个高度出现次数最多就保留

/*
思维
满足条件的序列,ai-i相同
*/
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5+5;
int a[MAXN];
map<int,int> mp;

int main(){
    int n; cin>>n;
    for (int i=0; i<n; i++) cin>>a[i];
    int m=(n+1)/2;
    for (int i=0; i<m; i++) a[i]-=i;
    for (int i=m; i<n; i++) a[i]-=n-i-1;
    for (int i=0; i<n; i++) mp[a[i]]++;
    int ans=0;
    for (map<int,int>::iterator it=mp.begin(); it!=mp.end(); it++)
        ans=max(ans,it->second);
    cout<<n-ans<<endl;

    return 0;
}

    原文作者:B树
    原文地址: https://blog.csdn.net/leave8426/article/details/80114411
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞