题目
思路
因为可以完全重排,所以我们把一样的按钮排在一起,此时,重复的按钮没有贡献。所以我们只要记录1~8是否出现就可以了。接下来,我们很难不能发现,答案就是完整走一圈的步数减去最长的两个按钮之间的距离:D(我什么时候才能有这样的观察力)
时间复杂度为:O(n)
AC code
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve() {
int n;
cin>>n;
map<int,int>m;
for(int i=0;i<n;i++){
int t;
cin>>t;
m[t-1]=1;//注意!!!索引要换成0-based(原因见下)
}
int cnt=0,maxx=0;
for(int i=1;i<=16;i++){//注意!!!要遍历两圈,因为可能最长的那个区间横跨了1,8
if(!m[i%8])cnt++;//原因:i%8有为0的时候
else cnt=0;
maxx=max(maxx,cnt);
}
cout<<7-maxx<<endl;//完整走一圈要7步
}
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}```