题意:
给定一个长度为n的数组,任意两个数如果满足i-j的绝对值等于k则可以互相交换,若不能通过此操作实现数组排序,则需要使用次数来强制交换,次数小于等于1输出次数,否则输出-1.
分析:
最优情况下,找出需要操作的数的数量然后两两交换是次数最少的。
代码:
#include <bits/stdc++.h> #define fi first #define se second using namespace std; typedef pair<int,int> pii; typedef long long ll; const int N=2e5+10; int a[N]; int b[N]; void solve() { int t; cin>>t; while(t--) { int n,k; cin>>n>>k; for(int i=1;i<=n;i++) { cin>>a[i]; b[a[i]]=i; } int sum=0; for(int i=1;i<=n;i++) { int j=b[i]; if(abs(j-i)%k==0) continue; else { sum++; } } if(sum==0) cout<<0<<'\n'; else if(sum<=2) cout<<1<<'\n'; else cout<<-1<<'\n'; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】