# 2024 愚人節題目集 Day 7 - 社區高中
題目 & 題序 by AaW
---
Cjtsai 是大電神,都會寫 Rust,幫都在混的 AaW 賺到 YTP 的獎金
賺到錢之後,為了讓錢滾錢,cjtsai 決定開一間名為建中的學店,販售各大社區高中文憑。
已知,cjtsai 總共販售 $m$ 種文憑,一個月會有 $n$ 個客人光顧。
為了維護市場機制同時最大化獲利,cjtsai 打算利用一個函數來動態決定每種文憑的價格。
但是,出這題的 AaW 公民沒學好,所以他要亂掰一個函數。
已知,cjtsai 會為第 $x$ 種文憑定義一個基本價格 $p_x$
第 i 位顧客要購買第 $a_i$ 種文憑 $b_i$ 張,他的期待價格為 $c_i$,視野範圍為 $d_i$
第 i 位顧客的成交價格 $k_i$ 為期待價格 $c_i$ 、市場行情價為 $g(a_i, d_i, i)$,基本價格$p_{a_i}$ 的平均(無條件捨去到整數位),
同時定義市場行情價為第 $d_i$ 個人到第 $i-1$ 個人所購買第 $a_i$ 種文憑的成交單價($k_j$)加權平均數(無條件捨去到整數位),
即 $g(a_i, d_i, i) = \lfloor \frac{ \sum \limits_{j = d_i} ^ {i} (a_j == a_i) \times k_j\times b_j}{\sum \limits_{j = d_i} ^ i b_j} \rfloor$
若第 $d_i$ 個人到第 $i-1$ 個人都沒有購買第 $a_i$ 種文憑,則市場行情價為$0$
透過上述公式,我們可以輕鬆得知,cjtsai 的總獲利就是 $\sum \limits_{i = 1} ^ {n} b_i \times k_i$,輕鬆賺大錢ㄋㄚ~
然而cjtsai在估算行情價時忘記把房租成本算進去了。我們都知道,建中附近房東不是省油的燈,每次都一直漲租金漲到把電搞垮。cjtsai的房東也不例外,他看cjtsai賺了很多錢,決定提高房租。
已知,房東會派人檢查 cjtsai 總共有多少客戶,以及估計第 i 個顧客的總消費額 $w_i$,並且將房租定義為 $\sum \limits_{i = 1} ^ {n} \lfloor 0.9 \times w_i \rfloor$。
cjtsai 忙著賺大錢和交女朋友,於是請 AaW 幫他寫一個程式計算他總共會獲利或虧損多少錢。
但 AaW 不會寫 code ,寫出來的 code 一堆 bug ,你可以幫他除蟲嗎?
以下為 AaW 所寫的 code
在 edit distance 30 以內將其修改正確,可獲得 50 分
在 edit distance 3 以內將其修改正確,可獲得 100 分
edit distance 計算方式請見 hint 欄位
```cpp
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(x) cerr << x << endl;
signed main(){
ios::sync_with_stdio(0); cin.tie(0);
int n, m, s, l = true;
cin >> n >> m;
vector<int> p(m+1);
for (int i = 1; i <= m; ++i) cin >> p[i];
// sum of profit
s = 0;
// pre sum array of product a_i
vector<vector<int>> pre(m+1, vector<int>(n+1, 0));
vector<vector<int>> cnt(m+1, vector<int>(n+1, 0));
for (int i = 1; i <= n; ++i) {
int a, b, c, d;
cin >> a >> b >> c >> d;
int g;
if (cnt[a][i-1] - cnt[a][d-1] <= 0) g = 0;
else g = (pre[a][i-1] - pre[a][d-1]) / (cnt[a][i-1] - cnt[a][d-1]);
int k = (c + g + p[a]) / 3;
pre[a][i] = pre[a][i-1] + b * k;
cnt[a][i] = cnt[a][i-1] + b;
for (int j = 1; j <= m; ++j) {
if (j != a) {
pre[j][i] = pre[j][i-1];
cnt[j][i] = cnt[j][i-1];
}
}
s += b * k;
}
// debug output
// int e = 0;
// for (int i = 1; i <= m; ++i) {
// e += pre[i][n];
// }
// debug(e);
// caculate shop rent
auto shop = [&](){
int value = 0;
float percent = 0.9;
for (int i = 1; i <= n; ++i) {
int w; cin >> w;
// use minus because shop rent reduce profit;
value -= floor(w * percent);
}
return value;
}();
cout << shop + s << endl;
return 0;
}
```