2024.07.13科大訊飛提前批

失控D大白兔發表於2024-09-03

1. 找01

牛牛擁有一個長度為 n 的01 串,現在他想知道,對於每個字元,在它前面的最近的不同字元的下標是多少?

兩個下標記錄上一個01位置
int main(int argc, char *argv[]) {

    int T;
    cin>>T;//測試組數
    while(T--){
        int n;
        cin>>n;
        string s;
        cin>>s;
        int idx0 =- 1; int idx1 = -1;//分貝記錄上一個0和1的位置
        vector<int> res(n,-1);
        for(int i=0;i<n;i++){//遍歷所有字元
            if(s[i]=='0'){
                res[i] = idx1;
                idx0 = i;
            }
            else{
                res[i] = idx0;
                idx1 = i;
            }
        }
        for(int i=0;i<n;i++){
            if(i>0) cout<<" ";
            if(res[i]==-1) cout<<res[i];
            else cout<<res[i]+1;
        }
        cout<<endl;
    }
    return 0;
}

2. 不能出現太多

給定n個數字A1,A2,..An,請求出這些數字中出現次數小於等於k的最小的數。

先雜湊計數再篩選可以避免排序
int main(int argc, char *argv[]) {

    int n; int k;
    cin>>n;
    cin>>k;
    vector<int> nums(n);
    unordered_map<int,int> m;
    for(int i=0;i<n;i++){
        cin>>nums[i];
        m[nums[i]]++;
    }
    int res = INT_MAX;
    for(auto num:nums){
        if(m[num]>k) continue;
        res = min(res,num);
    }
    if(res==INT_MAX) cout<<-1;
    else cout<<res;
    
    return 0;
}

3. 乘2除2

給出一個大小為n的序列a,每次操作可以選擇序列a中的一個數x,把x變成x*2或者[x/2](對同一個a可以操作多次但不能既進行乘操作又進行除操作)。

點選檢視程式碼

相關文章