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

A.队列


思路

STL-queue

AC代码

    void solve(){
        int n;
        queue<int> q;
        cin >> n;
        while(n -- ){
            int op, x;
            cin >> op;
            if(op == 1){
                cin >> x;
                q.push(x);
            }
            else if(op == 2){
                if(!q.empty()) q.pop();
                else cout << "ERR_CANNOT_POP" << endl;
            }
            else if(op == 3){
                if(!q.empty()) cout << q.front() << endl;
                else cout << "ERR_CANNOT_QUERY" << endl;
            }
            else cout << q.size() << endl;
        }
    }

B.字符串哈希


思路

STL-vector + string

AC代码

    void solve(){
        int n;
        cin >> n;
        vector<string> v(n);
        for(int i = 0; i < n ; i ++ ){
            cin >> v[i];
        }
        sort(v.begin(), v.end());
        n = unique(v.begin(), v.end()) - v.begin();
        cout << n << 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 solve(){
        cin >> a;
        for(int i = 0; i < 512; i ++ ){
            int e = i;
            for(int j = 1; j <= m ; j ++ ){
                e = g(e, k[j]);
            }
            if(e == a){
                cout << i << " ";
                return ;
            }
        }
    }

D.笨小猴


思路

STL-string,vector + 数学

AC代码

    bool f(int x){
        if(x <= 1)return false;
        if(x == 2)return true;
        if(x % 2 == 0)return false;
        for(int i = 3; i * i <= x; i += 2){
            if(x % i == 0)return false;
        }
        return true;
    }

    void solve(){
        string s;
        cin >> s;
        vector<int> v(26, 0);
        for(auto i : s){
            v[i - 'a'] ++;
        }
        int a =  -1;
        int b = MAX;
        for(auto i : v){
            if(i != 0){
                a = max(a, i);
                b = min(b, i);
            }
        }
        if(f(a - b)){
            cout << "Lucky Word" << endl;
            cout << a - b << endl;
        }
        else{
            cout << "No Answer" << endl;
            cout << 0 << endl;
        }

    }

E.编号


思路

数学

AC代码

    void solve(){
        int n;
        cin >> n;
        vector<int> v(n);
        for(int i = 0; i < n; i ++ ){
            cin >>v[i];
        }
        sort(v.begin(), v.end());
        int ans = 1;
        for(int i = 0; i < n; i ++ ){
            ans = (ans * max((v[i] - i), 0ll)) % MOD;
        }
        cout << ans << endl;
    }

F.生活大爆炸版石头剪刀布


思路

模拟

AC代码

    int n, a, b, p[205],q[205], x, y;
    int k[5][5] = {{0, 0, 1, 1, 0},
                    {1, 0, 0, 1, 0},
    			    {0, 1, 0, 0, 1},
    			    {0, 0, 1, 0, 1},
    			    {1, 1, 0, 0, 0}};

    void solve(){
        cin >> n >> a >> b;
    	for (int i = 0; i < a; i++) 
    		cin >> p[i];
    	for (int i = 0; i < b; i++) 
    		cin >> q[i];
    	for (int i = 0; i < n; i++) {
        	x += k[p[i % a]][q[i % b]];
        	y += k[q[i % b]][p[i % a]];
    	}
    	cout << x << " " << y;
    }

G.小Z的情书


思路

模拟

AC代码

    void write(){
        for(int i = 1; i <= n; i ++ ){
            for(int j = 1; j <= n; j ++ ){
                if(g[i][j] == 'O')ans += e[i][j];
            }
        }
    }

    void f(){
        for(int i = 1; i <= n; i ++ ){
            for(int j = 1; j <= n; j ++ ){
                t[j][n - i + 1] = g[i][j];
            }
        }
        for(int i = 1; i <= n; i ++ ){
            for(int j = 1; j <= n; j ++ ){
               g[i][j] = t[i][j];
            }
        }
    }

    void solve(){
        cin >> n;
        for(int i = 1; i <= n; i ++ ){
            for(int j = 1; j <= n; j ++ ){
                cin >> g[i][j];
            }
        }
        for(int i = 1; i <= n; i ++ ){
            for(int j = 1; j <= n; j ++ ){
                cin >> e[i][j];
            }
        }
        for(int i = 1; i <= 4; i ++ ){
            write();
            f();
        }
        cout << ans << endl;

    }

AC代码(优化版)

    void write(){
        for(auto i : v){
            ans += e[i.first][i.second];
        }
    }

    void f(){
        for(auto &i : v){
            int x = i.first;
            int y = i.second;
            i.first = y;
            i.second = n - x + 1;
        }
        sort(v.begin(), v.end());
    }

    void solve(){
        cin >> n;
        for(int i = 1; i <= n; i ++ ){
            for(int j = 1; j <= n; j ++ ){
               char c;
               cin >> c;
               if(c == 'O')v.push_back({i, j});
            }
        }
        for(int i = 1; i <= n; i ++ ){
            for(int j = 1; j <= n; j ++ ){
                cin >> e[i][j];
            }
        }
        for(int i = 1; i <= 4; i ++ ){
            write();
            f();
        }
        cout << ans << endl;

    }

H.第39次CSP认证第二题—水印检查


思路

模拟

AC代码

    void init() {
        csp[1][1] = csp[1][2] = csp[1][4] = csp[1][5] = csp[1][7] = 1;
        csp[2][1] = csp[2][2] = csp[2][8] = 1;
        csp[3][1] = csp[3][2] = csp[3][3] = csp[3][4] = csp[3][7] = csp[3][8] = 1;
        csp[4][7] = csp[4][8] = 1;
    }


    void solve(){
        cin >> n >> l;
        for(int i = 1; i <= n ; i ++ ){
            for(int j = 1 ; j <= n ; j ++ ){
                cin >> g[i][j];
            }
        }
        init();
        for(int k = 0; k <= l - 1; k ++ ){
            bool key = false;
            for(int i = 1 ; i <= n - 4; i ++ ){
                for(int j = 1; j <= n - 8 ;j ++ ){
                    int num = 0;
                    for(int x = 0; x <= 4; x ++ ){
                        for(int y = 0; y <= 8; y ++ ){
                            if(csp[x][y] == 0 && g[i + x][j + y] >= k)num ++ ;
                            else if(csp[x][y] == 1 && g[i + x][j + y] < k)num ++;
                        }
                    }
                    if(num == 5 * 9)key = true;
                }
            }
            if(key)ans[k]++;
        }
        for(auto & i: ans)cout << i << endl;
        return ;
    }

代码模板

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    void solve(){

    }

    signed main()
    {
        fast();
        
        int t=1;
        cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }
posted @ 2026-02-03 18:01  Oaths  阅读(10)  评论(0)    收藏  举报