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); } }