12/26 牛客月赛 B solution

16 阅读1分钟

题目

B-小红写谱_牛客小白月赛126

思路

因为可以完全重排,所以我们把一样的按钮排在一起,此时,重复的按钮没有贡献。所以我们只要记录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;
}```