列表

详情


NC207758. 等和数列

描述

热烈庆祝沈阳航空航天大学开源软件协会(SAU OSSA)成立,OSSA前身是沈阳航空航天大学PostgreSQL数据库协会,随着成员的不断增多,经过半年多的沉淀,现已积攒大量的沈航ACM协会、沈航计算机博弈协会,创意IT俱乐部以及众多的软件开发和数媒设计人才,加上计算机学院的大力支持,背靠科技文化中心的优秀资源,最终融合成立OSSA。
面试预计会于20届学生会纳新同步进行,届时请关注公众号:沈航创意IT俱乐部

输入描述

输出描述

示例1

输入:

2
4 2 
1 1 1 2
4 2
1 1 1 1

输出:

1
0

说明:

在第一组样例中,你只需要将最后一个数字变成 1 ,即可达到要求,所以花费是 1 。

在第二组样例中,原数列已经满足要求,所以花费是 0 。

原站题解

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

C++14(g++5.4) 解法, 执行用时: 71ms, 内存消耗: 1380K, 提交时间: 2020-06-16 18:31:05

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;

#define ll long long
#define per(i,f,t) for(register int i=f,tt=(t);i<tt;++i)
#define rep(i,f,t) for(register int i=f,tt=(t);i>tt;--i)

int a[50005],cnt[200005];
int main()
{
    int t,t1,t2,n,k,ans,now;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&k);
        memset(cnt,0,sizeof(cnt));
        per(i,1,(n>>1)+1)
            scanf("%d",a+i);
        rep(i,n>>1,0){
            scanf("%d",&t1);
            t2=a[i];
            --cnt[(t1>t2?t2:t1)+1];
            --cnt[t1+t2];
            ++cnt[t1+t2+1];
            ++cnt[(t1>t2?t1:t2)+k+1];
        }
        ans=now=n;
        per(i,2,k<<1)
            now+=cnt[i],ans=min(ans,now);
        printf("%d\n",ans);
    }
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 82ms, 内存消耗: 1536K, 提交时间: 2023-07-22 09:26:56

#include<bits/stdc++.h>
using namespace std;
const int MAXN=400005;
int a[MAXN],cnt[MAXN];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n,k;
		scanf("%d%d",&n,&k);
		for(int i=2;i<=2*k;i++)
		cnt[i]=0;
		for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
		for(int i=1;i<=n/2;i++)
		{
			int l=a[i],r=a[n+1-i];
			if(l>r) swap(l,r);
			cnt[2]+=2;
			cnt[1+l]+=-1;
			cnt[l+r]+=-1;
			cnt[l+r+1]+=1;
			cnt[r+k+1]+=1;
		}
		for(int i=3;i<=2*k;i++)
		cnt[i]+=cnt[i-1];
		int res=n;
		for(int i=2;i<=2*k;i++)
		res=min(res,cnt[i]);
		printf("%d\n",res);
	}
}

上一题