2024.12.8 週日
Q1. 1100
給定n,k。構造長度為n的陣列,元素之和為k,且按位或和的值在二進位制下1最多。
Q2. 1300
給定兩行01串,從(1,1)走到(2,n),每次只能向右或向下走。問路徑經過的最小字串以及方案數。
Q3. 1200
將一個陣列分為連續的k>1段,使每段的MEX(未出現的最小自然數)相等。
Q4. 1400
給定n,m,k(1e9)與長度為n陣列vec:第i天價格。如果第i天買x張票,那麼以後每天的價格+x。每天最多買m張票,問買k張票的最小代價。
------------------------獨自思考分割線------------------------
-
這次的4道題都特別好。Q1wa了一發,Q2:45分鐘,Q3:50分鐘,Q4沒出。
A1. 2點
1.假思路:一個數構造一個1:1 2 4 8...
2.本質是考慮1數量的上限,構造小於等於k的數中1最多的數,最多2項即可。
A2. 2點
1.找到目標字串可以bfs,也可用點思維:發現僅有一個拐點(向下走),列舉尋找拐點,判斷方式:貪心一下發現a[2][i]<a[1][i+1]時作為拐點最優。
2.方案數用一下dp:f[i][j]=f[i-1][j]+f[i][j-1];
vector<array<int,3>>陣列開小了調了半天。
A3. 2點
1.發現小性質:若可以分為k段則一定可分為2段。
2.列舉分界點,資料結構維護左右MEX,更新加判斷。
A4.
1.思路不放了,放點思想。有點難度的貪心:一種貪心策略滿足兩層條件。
2.微擾法代替數學證明:簡單易懂。
------------------------程式碼分割線------------------------
A1.
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(6);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n, k;
cin >> n >> k;
vector<int> res;
for (int i = 0;; i++)
if (k >> i == 0)
{
int t = (1ll << i - 1) - 1;
res.push_back(t);
break;
}
res.push_back(k - res[0]);
for (int i = res.size() + 1; i <= n; i++)
res.push_back(0);
if (n == 1)
res.assign(1, k);
for (auto v : res)
cout << v << ' ';
cout << endl;
// for (int i = 1; i < n; i++)
// {
// if (k < st)
// break;
// k -= st;
// res.push_back(st);
// st <<= 1;
// }
// res.push_back(k);
// for (int i = res.size() + 1; i <= n; i++)
// res.push_back(0);
// for (auto v : res)
// cout << v << ' ';
// cout << endl;
}
A2.
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(6);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n;
cin >> n;
vector<string> a(3);
for (int i = 1; i <= 2; i++)
{
cin >> a[i];
a[i] = " " + a[i];
}
int o = n;
for (int i = 1; i < n; i++)
if (a[2][i] < a[1][i + 1])
{
o = i;
break;
}
string res = a[1].substr(1, o) + a[2].substr(o);
cout << res << endl;
res = " " + res;
vector<vector<int>> f(3, vector<int>(n + 1));
f[1][0] = 1;
for (int i = 1; i <= 2; i++)
for (int j = 1; j <= n; j++)
{
int t = i == 1 ? 0 : 1;
if (a[i][j] - res[t + j])
continue;
if (i == 1)
f[i][j] = f[i][j - 1];
else
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
cout << f[2][n] << endl;
}
A3.
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(6);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n;
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
map<int, int> MEX_l, MEX_r, l, r;
l[a[1]]++;
for (int i = 2; i <= n; i++)
r[a[i]]++;
for (int i = 0; i <= n; i++)
if (!l.count(i))
MEX_l[i] = 1;
for (int i = 0; i <= n; i++)
if (!r.count(i))
MEX_r[i] = 1;
auto seg = [](int l, int r)
{
cout << l << " " << r << endl;
};
auto same = [&]()
{
return (*MEX_l.begin()).first == (*MEX_r.begin()).first;
};
auto get = [&]()
{
bug2((*MEX_l.begin()).first, (*MEX_r.begin()).first);
};
// get();
if (same())
{
// get();
cout << 2 << endl;
seg(1, 1);
seg(2, n);
return;
}
for (int i = 2; i < n; i++)
{
if (MEX_l.count(a[i]))
MEX_l.erase(a[i]);
l[a[i]]++;
r[a[i]]--;
if (r[a[i]] == 0)
MEX_r[a[i]] = 1;
if (same())
{
// get();
cout << 2 << endl;
seg(1, i);
seg(i + 1, n);
return;
}
}
cout << -1 << endl;
}
// void _()
// {
// int n;
// cin >> n;
// vector<int> a(n + 1);
// for (int i = 1; i <= n; i++)
// cin >> a[i];
// vector<int> di;
// for (int i = 1; i <= n / i; i++)
// if (n % i == 0)
// di.push_back(i);
// // bug(di.size()); // 17
// for (auto len : di)
// {
// // bug(len);
// vector<pair<int, int>> res;
// map<int, int> ans;
// for (int r = len; r <= n; r += len)
// {
// int l = r - len + 1;
// res.push_back({l, r});
// map<int, int> has;
// for (int i = l; i <= r; i++)
// has[a[i]] = 1;
// for (int i = 0;; i++)
// if (!has[i])
// {
// ans[i] = 1;
// break;
// }
// }
// if (ans.size() == 1)
// {
// cout << n / len << endl;
// for (auto [l, r] : res)
// cout << l << ' ' << r << endl;
// return;
// }
// }
// cout << -1 << endl;
// }
A4.
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(6);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n, m, k;
cin >> n >> m >> k;
vector<int> vec(n);
for (int &x : vec)
cin >> x;
sort(vec.begin(), vec.end());
int res = 0, pre = 0;
for (auto v : vec)
{
int buy = min(k, m);
k -= buy;
res += buy * (pre + v);
pre += buy;
}
cout << res << endl;
}