中石大第41次CSP培训Week2题解

A.字符串哈希


思路

STL- map

AC代码

    void solve(){
        int n;
        cin >> n;
        map<string, int> mp;
        for(int i = 1; i <= n ; i ++ ){
            string s;
            cin >> s;
            mp[s] ++;
        }
        cout << mp.size() << endl;
        return ;
    }

B.第40次CSP认证第一题:集合(set)


思路

模拟

AC代码

    bool f1(int i){
        if(s[i].size() != t[i].size()){
            return false;
        }
        for(int j = 0; j < s[i].size(); j ++ ){
            if(s[i][j] != t[i][j]){
                return false;
             }
        }
        return true;
    } 

    bool f2(int i){
        int x = 0, y = 0;
        for(int j = 0; j < s[i].size() ; j ++ ){
            x ^= a[s[i][j]];
        }
        for(int j = 0; j < t[i].size() ; j ++ ){
            y ^= a[t[i][j]];
        }
        return x == y;
    }


    void solve(){
        cin >> n >> m;
        for(int i = 1; i <= n; i ++ ){
            cin >> a[i];
        }
        for(int i = 1; i <= 2 * m ; i ++ ){
    	    int num;
            cin >> num;
            while(num --){
        	    int e;
                cin >> e;
                if(i <= m)s[i].pb(e);
                else t[i - m].pb(e);
            }
        }
        for(int i = 1; i <= m ; i ++ ){
    	    cout <<( f1(i) ^ f2(i) ? "wrong" : "correct")<< endl;
        }

        return ;
    }

C.第40次CSP认证第二题:数字变换 (transform)


思路

预处理

AC代码

    int f(int x, int k){
        return ((x * x + k * k) % 8 ) ^ k;
    }

    int g(int x, int k){
        int a = (x >> 6) & 7;
        int b = (x >> 3) & 7;
        int c = x & 7;
        return ((b << 6) + ((c ^ f(b, k)) << 3) + (a ^ f(c, k)));
    }

    void init(){
        cin >> n >> m;
        for(int i = 1; i <= m ; i ++ ){
            cin >> k[i];
        }
        for(int i = 0; i < 512; i ++ ){
            int e = i;
            for(int j = 1; j <= m ; j ++ ){
                e = g(e, k[j]);
            }
            ans[e] = i; 
        }
    }

    void solve(){
        cin >> a;
        cout << ans[a] << " ";
        return ;
    }

    signed main()
    {
        fast();
        init();
        while(n--){
            solve();
        }
        return 0;
    }

D.全排列问题


思路

DFS

AC代码

    void dfs(int x){
        if(x > n){
            for(int i = 1; i <= n ; i ++ ){
                cout << "    " << ans[i];
            }
            cout << endl;
            return ;
        }

        for(int i = 1; i <= n ; i ++ ){
            if(!st[i]){
                st[i] = true;
                ans[x] = i;
                dfs(x + 1);
                st[i] = false;
            }
        }
        return ;
    }

    void solve(){
        cin >> n;
        memset(st, false, sizeof st);
        dfs(1);
    }

E.第38次CSP认证第二题:机器人复健指南


思路

BFS

AC代码

    int dx[8] = {2, 2, 1, 1, -2, -2, -1, -1};
    int dy[8] = {1, -1, 2, -2, 1, -1, 2, -2};
    void bfs(){
        queue<PII> q;
        memset(num, -1, sizeof num);
        num[sx][sy] = 0;
        q.push({sx, sy});
        while(q.size()){
            int x = q.front().first;
            int y = q.front().second;
            q.pop();
            for(int i = 0; i < 8; i ++ ){
                int x0 = x + dx[i];
                int y0 = y + dy[i];
                if(x0 >= 1 && x0 <= n && y0 >= 1 && y0 <= n && num[x0][y0] == -1){
                    ans ++;
                    num[x0][y0] = num[x][y] + 1;
                    if(num[x0][y0] < k)q.push({x0, y0});
                }
            }
        }
    }

    void solve(){
        cin >> n >> k >> sx >> sy;
        bfs();
        cout << ans << endl;
        return ;

    }

F.排队接水


思路

贪心——排序

AC代码

    void solve(){
        cin >> n;
        a[0] = {0, 0};
        for(int i = 1; i <= n; i ++ )cin >> a[i].first, a[i].second = i;
        sort(a + 1, a + 1 + n);
        for(int i = 1; i <= n; i ++ )a[i].first += a[i - 1].first, cout << a[i].second << " ";
        cout << endl;
        for(int i = 1; i <= n; i ++ )ans += a[i - 1].first * 1.0;
        printf("%.2lf", ans/n*1.0);
        return ;
    }

G.小A的糖果


思路

贪心

AC代码

    void solve(){
        int n, m;
        cin >> n >> m;
        int a[n + 1];
        for(int i = 1; i <= n; i ++ ){
            cin >> a[i];
        }
        int ans = 0;
        for(int i = 2; i <= n; i ++ ){
            if(a[i] + a[i - 1] > m){
                ans += a[i] + a[i - 1] - m;
                if(a[i] < a[i] + a[i - 1] - m){
                    a[i] = 0;
                }
                else a[i] -= a[i] + a[i - 1] - m;
            }
        }
        cout << ans << endl;
    }
posted @ 2026-02-06 16:30  Oaths  阅读(0)  评论(0)    收藏  举报