列表

详情


NC212820. 小y的序列

描述

又是一年 CSP,机房的oier都在刷题,alan却在发呆想着小y,正巧忽然听到隔壁机房某神zlk熟悉的声音:“找规律就可以了吧,这个序列感觉很熟悉啊,就是1,2,4,6,11这其实就是一个a[i+1]-a[i]=i的序列哦,突然隔壁的声音大了起来,zlk,你好像有个数写错了(大雾)~
课后,alan在纸上写下了这个题目,让szm做:给一个长度为n的序列a,你希望改最少的数,使得这个序列满足a[i+1]-a[i]=i吗?1<=i<n。

输入描述

第一行一个整数n;
第二行n个整数(每两个数之间有个空格),分别表示a[1]到a[n]。

输出描述

输出一个整数Ans,表示最少需要改多少个数

示例1

输入:

6
3 4 6 8 13 18

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 58ms, 内存消耗: 4300K, 提交时间: 2020-10-14 20:31:28

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a,ans;
map<ll,ll> mp;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a;
		mp[a-i*(i+1)/2-1]++;
		ans = max(ans,mp[a-i*(i+1)/2-1]);
	}
	cout<<n-ans<<endl;
} 

C++ 解法, 执行用时: 47ms, 内存消耗: 3236K, 提交时间: 2021-09-12 22:50:59

#include<iostream>
#include<map>
using namespace std;
int n,m,sum=-1;
map<int,int>mp;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>m;
		m=m-i*(i-1)/2;
		mp[m]++;
		sum=max(sum,mp[m]);
	}
	cout<<n-sum<<endl;
return 0;
}

Python3 解法, 执行用时: 263ms, 内存消耗: 17364K, 提交时间: 2021-11-26 20:06:36

n=int(input())
a=list(map(int,input().split()))
d={}
m=0
for i in range(n):
    k=0
    t=a[i]-i*(i+1)//2
    if t not in d.keys():
        d[t]=1
    else:
        d[t]+=1
    m=max(m,d[t])
print(n-m)

上一题