华为AI-编程题-03

20260408

  • 2
  1. 思路

    • Db 加了 3 次,注意位置。
  2. 代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using db = double;

void solve() {

    cout << fixed << setprecision(2);

    int n,t;
    db lr;
    cin >> n >> t >> lr;
    
    const db inf = 1E18;
    vector<db> mx(3 , -inf),mn(3 , inf);
    vector<vector<db>> x(n , vector<db>(4));
    for (int i = 0 ; i < n ; ++i) {
        for (int j = 0 ; j < 4 ; ++j) {
            cin >> x[i][j];
            if (j < 3) {
                mx[j] = max(mx[j] , x[i][j]);
                mn[j] = min(mn[j] , x[i][j]);
            }
        }
    }

    auto x_tmp = x;
    for (int j = 0 ; j < 3 ; ++j) {
        for (int i = 0 ; i < n ; ++i) {
            if (mn[j] == mx[j]) x[i][j] = 0;
            else x[i][j] = (x[i][j] - mn[j]) / (mx[j] - mn[j]);
        }
    }

    db b = 0;
    vector<db> w(3);
    while (t--) {
        db Db = 0;
        vector<db> dw(3);
        for (int i = 0 ; i < n ; ++i) {
            db y_hat = b , y = x[i][3];
            for (int j = 0 ; j < 3 ; ++j) {
                y_hat += w[j] * x[i][j];
            }
            Db += (y_hat - y);
            for (int j = 0 ; j < 3 ; ++j) {
                dw[j] += (y_hat - y) * x[i][j];
            }
        }
        Db /= n;
        for (int j = 0 ; j < 3 ; ++j) dw[j] /= n;
        b -= lr * Db;
        for (int j = 0 ; j < 3 ; ++j) w[j] -= lr * dw[j];
    }
    
    for (int j = 0 ; j < 3 ; ++j) {
        if (mn[j] == mx[j]) w[j] = 0;
        else w[j] /= (mx[j] - mn[j]);
        b -= w[j] * mn[j];
    }

    cout << b << " ";
    for (int j = 0 ; j < 3 ; ++j) {
        cout << w[j];
        if (j != 2) cout << " ";
    }

}

int main() {

    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    while (t--) {
        solve();
    }

    return 0;
}
  • 3
  1. 思路

    • 先跟新 cen_tmp , 再计算偏移距离
  2. 代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using db = double;

void solve() {

    int k,n,speed;
    cin >> k >> n >> speed;

    k = min(k , n);
    vector<pair<db,db>> d(n);
    for (int i = 0 ; i < n ;++i) {
        cin >> d[i].first >> d[i].second;
    }
    

    auto sq = [&] (db x) {
        return x * x;
    };

    vector<int> id(n);
    iota(id.begin() , id.end() , 0);
    sort(id.begin() , id.end() , [&](int x,int y){
        db dist1 = sq(d[x].first) + sq(d[x].second);
        db dist2 = sq(d[y].first) + sq(d[y].second);
        if (dist1 == dist2) {
            return x < y;
        } else {
            return dist1 < dist2;
        }
    });

    vector<pair<db,db>> cen(k);
    for (int i = 0 ; i < k ; ++i) {
        int j = id[i];
        cen[i] = d[j];
    }

    auto get = [&] (int i,int j) {
        return sq(d[i].first - cen[j].first) 
        + sq(d[i].second - cen[j].second);
    };
    auto get1 = [&](db x1,db y1,db x2,db y2) {
        return sqrt(sq(x1 - x2) + sq(y1 - y2));
    };
    
    int max_iters = 50;
    db tol = 1e-4;
    while (max_iters--) {
        vector<int> cnt(k);
        vector<pair<db,db>> cen_tmp(k);
        for (int i = 0 ; i < n ; ++i) {
            vector<int> idd(k);
            iota(idd.begin() , idd.end() , 0);
            sort(idd.begin() , idd.end() , [&](int x,int y){
                return get(i,x) < get(i,y);
            });
            cnt[idd[0]] += 1;
            cen_tmp[idd[0]].first += d[i].first;
            cen_tmp[idd[0]].second += d[i].second;
        }
        for (int i = 0 ; i < k ; ++i) {
            if (cnt[i] == 0) cen_tmp[i] = cen[i];
            else cen_tmp[i].first /= cnt[i] , cen_tmp[i].second /= cnt[i];
        }
        db res = 0;
        for (int i = 0 ; i < k ; ++i) {
            res += get1(cen[i].first , cen[i].second , cen_tmp[i].first , cen_tmp[i].second);
        }
        cen = cen_tmp;
        if (res < tol) {
            break;
        }
    }
    
    // cout << cen.size() << "\n";
    // for (auto [x,y]:cen) {
    //     cout << x << " " << y << "\n";
    // }
    // return;
    
    vector<int> id1(k);
    iota(id1.begin() , id1.end() , 0);
    sort(id1.begin() , id1.end() , [&](int x,int y){
        db dist1 = sq(cen[x].first) + sq(cen[x].second);
        db dist2 = sq(cen[y].first) + sq(cen[y].second);
        return dist1 < dist2;
    });


    db prex = 0 , prey = 0 , ans = 0;
    for (int i = 0 ; i < k ; ++i) {
        int j = id1[i];
        ans += get1(prex , prey , cen[j].first , cen[j].second);
        prex = cen[j].first , prey = cen[j].second;
    }
    ans += get1(prex,prey,0,0);
    
    ans = ans / speed * 3600;
    cout << int(ans) ;
}

int main() {

    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    while (t--) {
        solve();
    }

    return 0;
}

20250905

  • 2
  1. 思路

    • 枚举模拟
  2. 代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using db = double;

void solve() {
    
    int m;
    cin >> m;

    vector<array<int,2>> x(m);
    for (int i = 0 ; i < m ; ++i) {
        cin >> x[i][0] >> x[i][1];
    }
    sort(x.begin() , x.end());

    int label_l,label_r;
    cin >> label_l >> label_r;

    cout << fixed << setprecision(3);

    vector<array<int,2>> pre(m);
    for (int i = 0 ; i < m ; ++i) {
        if (i > 0) pre[i] = pre[i - 1];
        pre[i][x[i][1]] += 1;
    }
    auto work = [&] (int l,int r,int opt) {
        if (l > r) return 0;
        return pre[r][opt] - (l == 0 ? 0 : pre[l - 1][opt]);
    };

    int cnt = 0;
    for (int i = 0 ; i <= m ; ++i) {
        cnt = max(cnt , work(0 , i - 1 , label_l) + work(i , m - 1 , label_r));
    }

    cout << 1.0 * cnt / m << "\n";
}

int main() {

    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    while (t--) {
        solve();
    }

    return 0;
}
  • 3
  1. 思路

    • 概率 dp
  2. 代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using db = double;

void solve() {
    
    int n;
    cin >> n;

    int s,x,k;
    cin >> s >> x >> k;
    s -- , x --;

    vector<vector<db>> p(n , vector<db>(n));
    for (int i = 0 ; i < n ; ++i) {
        for (int j = 0 ; j < n ; ++j) {
            cin >> p[i][j];
        }
    }

    vector<db> dp(n);
    dp[s] = 1;

    while (k--) {
        vector<db> ndp(n);
        for (int i = 0 ; i < n ; ++i) {
            if (i == x) continue;
            for (int j = 0 ; j < n ; ++j) {
                if (j == x) continue;
                ndp[j] += dp[i] * p[i][j];
            }
        }
        swap(ndp , dp);
    }

    db ans = 0;
    for (int i = 0 ; i < n ; ++i) ans += dp[i];
    cout << fixed << setprecision(6) << ans << "\n";
}

int main() {
    
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    while (t--) {
        solve();
    }

    return 0;
}

20250904

  • 2
  1. 思路

    • 调度问题,本质是 np-hard 问题,只能做伪解,自己给出一个比题解更优的做法
  2. 代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using db = double;

void solve() {
    
    int n,m;
    cin >> n >> m;

    vector<int> a(m);
    for (int i = 0 ; i < m ; ++i) {
        cin >> a[i];
    }

    auto check = [&] (int v) {
        int s = 0 , cnt = 1;
        for (int i = 0 ; i < m ; ++i) {
            if (s + a[i] <= v) {
                s += a[i];
            }  else {
                s = a[i] , ++cnt;
            }
        }  
        return (cnt <= n);
    };

    int l = 1 , r = 1E9;
    while (l < r) {
        int md = (l + r) >> 1;
        if (check(md)) r = md;
        else l = md + 1;
    }

    cout << r << "\n";

}

int main() {

    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    while (t--) {
        solve();
    }

    return 0;
}
  • 3
  1. 思路

    • 要知道 Q,K,V 怎么来的,剩下的就是线性矩阵乘的过程

    alt text

  2. 代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using db = double;

void solve() {
    
    cout << fixed << setprecision(2);

    int L,D;
    char C;
    cin >> L >> C >> D;

    auto readLine = [&](vector<vector<db>> &x,int n,int m) {
        
        x.assign(n , vector<db>(m));
        
        string s;
        while (true) {
            getline(cin , s);
            if (!s.empty()) break; 
        }
        string t{};
        for (auto it : s) {
            if (it == ',') t.push_back(' ');
            else t.push_back(it);
        } 
        stringstream ss(t);
        double item;
        int i = 0 , j = 0;
        while (ss >> item) {
            x[i][j] = item;
            j ++;
            if (j == m) {
                i ++ , j = 0;
            }
        }
    };

    vector<vector<db>> x;
    readLine(x , L , D);
    
    vector<vector<db>> Wq1,Wk1,Wv1;
    readLine(Wq1 , D , D) , readLine(Wk1 , D , D) , readLine(Wv1 , D , D);
    vector<vector<db>> Wfc1,Bfc1;
    readLine(Wfc1 , D , D),readLine(Bfc1 , D , 1);

    vector<vector<db>> Wq2,Wk2,Wv2;
    readLine(Wq2 , D , D) , readLine(Wk2, D , D) , readLine(Wv2 , D , D);
    vector<vector<db>> Wfc2,Bfc2;
    readLine(Wfc2 , D , D),readLine(Bfc2 , D , 1);
    
    auto mat_mul = [&] (vector<vector<db>> &a,vector<vector<db>> &b) {
        int n = a.size() , m = b[0].size() , r = a[0].size();
        vector<vector<db>> c(n , vector<db>(m));
        for (int i = 0 ; i < n ; ++i) {
            for (int j = 0 ; j < m ; ++j) {
                for (int t = 0 ; t < r ; ++t) {
                    c[i][j] += a[i][t] * b[t][j];
                }
            }
        }
        return c;
    };

    auto self_att = [&] (vector<vector<db>>& X, 
                         vector<vector<db>>& Wq,
                         vector<vector<db>>& Wk,
                         vector<vector<db>>& Wv,
                         int L,int D) {

        //L,D
        auto Q = mat_mul(X, Wq);
        auto K = mat_mul(X, Wk);
        auto V = mat_mul(X, Wv);

        // 计算 Score = (Q * K^T) / sqrt(D)
        db scale = sqrt(db(D));
        vector<vector<db>> score(L , vector<db>(L , 0.0));
        //(L,D) * (D,L)
        for (int i = 0 ; i < L ; ++i) {
            for (int j = 0 ; j < L ; ++j) {
                for (int k = 0; k < D ; ++k) {
                    score[i][j] += Q[i][k] * K[j][k];
                }
                score[i][j] /= scale;
            }
        }

        //每一行都执行 Softmax
        for (int i = 0 ; i < L ; ++i) {
            db mx = *max_element(score[i].begin() , score[i].end());
            db sum_exp = 0;
            for (int j = 0 ; j < L ; ++j) {
                score[i][j] = exp(score[i][j] - mx);
                sum_exp += score[i][j];
            }
            for (int j = 0 ; j < L ; ++j) {
                score[i][j] /= sum_exp;
            }
        }

        //(L , L) * (L , D) -> (L , D)
        return mat_mul(score , V);
    };

    //Block1
    auto h1 = self_att(x , Wq1 , Wk1 , Wv1 , L , D);
    // cout << h1.size() << " " << h1[0].size() << " " << L << " " << D << "\n";
    // return;
    auto fc1 = mat_mul(h1 , Wfc1);
    // return;
    for (int i = 0 ; i < L ; ++i) {
        for (int j = 0 ; j < D ; ++j) {
            fc1[i][j] += Bfc1[j][0];
        }
    }
    // return;
    
    //Block2
    auto h2 = self_att(fc1 , Wq2 , Wk2 , Wv2 , L , D);
    auto fc2 = mat_mul(h2 , Wfc2);
    for (int i = 0 ; i < L ; ++i) {
        for (int j = 0 ; j < D ; ++j) {
            fc2[i][j] += Bfc2[j][0];
        }
    }

    for (int i = 0 ; i < L ; ++i) {
        for (int j = 0 ; j < D ; ++j) {
            cout << fc2[i][j];
            if (!(i == L - 1 && j == D - 1)) cout << ",";
        }
    }

}   

int main() {

    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    while (t--) {
        solve();
    }

    return 0;
}

20260415

  • 2
  1. 思路

    • 模拟
  2. 代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using db = double;

void solve() {

    int n;
    cin >> n;
    vector<db> x1(n + 1),x2(n + 1),ytrue(n + 1);
    for (int i = 1 ; i <= n ; ++i) {
        cin >> x1[i] >> x2[i] >> ytrue[i];
    }

    

    vector<vector<db>> o(n + 1, vector<db>(3));
    vector<vector<db>> g(n + 1, vector<db>(3)); 
    vector<vector<db>> m(n + 1, vector<db>(3));
    vector<vector<db>> v(n + 1, vector<db>(3));
    db b1 = 0.9 , b2 = 0.999 , l = 0.01 , a = 0.001 , esp = 1e-8;
    
    db B1 = 1 , B2 = 1;
    for (int i = 1 ; i <= n ; ++i) {
        db ypred = o[i - 1][0] * x1[i] + o[i - 1][1] * x2[i] + o[i - 1][2];
        db gw1 = 2.0 * (ypred - ytrue[i]) * x1[i];
        db gw2 = 2.0 * (ypred - ytrue[i]) * x2[i];
        db gb = 2.0 * (ypred - ytrue[i]);
        g[i] = {gw1 , gw2 , gb};
        for (int j = 0 ; j < 3 ; ++j) {
            m[i][j] = b1 * m[i - 1][j] + (1 - b1) * g[i][j]; 
            v[i][j] = b2 * v[i - 1][j] + (1 - b2) * g[i][j] * g[i][j];
        }
        B1 = B1 * b1 , B2 = B2 * b2;
        vector<db> m_hat(3),v_hat(3);
        for (int j = 0 ; j < 3 ; ++j) {
            m_hat[j] = m[i][j] / (1 - B1);
            v_hat[j] = v[i][j] / (1 - B2);
        }
        for (int j = 0 ; j < 3 ; ++j) {
            o[i][j] = o[i - 1][j] - a * (m_hat[j] / (sqrt(v_hat[j] + esp)) + l * o[i - 1][j]);
        }
    }

    cout << fixed << setprecision(6);
    for (int j = 0 ; j < 3 ; ++j) {
        cout << o[n][j] ;
        if (j != 2) cout << " ";
    }

}

int main() {
    
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    while (t--) {
        solve();
    }

    return 0;
}
  • 3
  1. 思路

    • dag 图上的 dp
  2. 代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using db = double;

void solve() {

    string s;
    while (true) {
        getline(cin , s);
        if (!s.empty()) {
            break;
        }
    }
    string t{};
    for (auto it : s) {
        if (it == ',') t.push_back(' ');
        else t.push_back(it);
    }
    stringstream ss(t);
    int item;
    vector<int> rk;
    while (ss >> item) {
        rk.push_back(item);
    }

    int n = rk.size();
    vector<int> deg(n);
    vector<vector<int>> adj(n);
    for (int i = 0 ; i < n - 1 ; ++i) {
        if (rk[i] <= 0) continue;
        if (rk[i] < rk[i + 1] && rk[i + 1] > 0) {
            adj[i].push_back(i + 1);
            deg[i + 1] ++;
        } else if (rk[i] > rk[i + 1] && rk[i + 1] > 0) {
            adj[i + 1].push_back(i);
            deg[i] ++;
        }
    }

    queue<int> Q;
    vector<int> dp(n);
    for (int i = 0 ; i < n ; ++i) {
        if (!deg[i]) {
            Q.push(i);
            dp[i] = 1;
        }
    }

    while (!Q.empty()) {
        auto u = Q.front();
        Q.pop();
        for (auto v : adj[u]) {
            dp[v] = max(dp[v] , dp[u] + 1);
            if (--deg[v] == 0) {
                Q.push(v);
            }
        }
    }

    int ans = 0;
    for (int i = 0 ; i < n ; ++i) {
        if (rk[i] > 0) ans += dp[i];
    }

    cout << ans << "\n";
}

int main() {
    
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    while (t--) {
        solve();
    }

    return 0;
}

posted @ 2026-04-09 23:22  xqy2003  阅读(12)  评论(0)    收藏  举报