华为AI-编程题-03
20260408
- 第
2题
-
思路
Db加了3次,注意位置。
-
代码
#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题
-
思路
- 先跟新
cen_tmp, 再计算偏移距离
- 先跟新
-
代码
#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题
-
思路
- 枚举模拟
-
代码
#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题
-
思路
- 概率
dp
- 概率
-
代码
#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题
-
思路
- 调度问题,本质是
np-hard问题,只能做伪解,自己给出一个比题解更优的做法
- 调度问题,本质是
-
代码
#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题
-
思路
- 要知道
Q,K,V怎么来的,剩下的就是线性矩阵乘的过程
![alt text]()
- 要知道
-
代码
#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题
-
思路
- 模拟
-
代码
#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题
-
思路
dag图上的dp
-
代码
#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;
}


浙公网安备 33010602011771号