逐月信息学 2024 提高组 #5
题目描述
有
思路
首先对
空间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000001;
struct Node {
int x, id;
}a[MAXN];
int n, s = 1, t;
int Binary_Search() {
int l = s, r = t;
for(; l < r; ) {
int mid = (l + r + 1) >> 1;
(a[mid].x - a[s].x <= a[t].x - a[mid].x ? l = mid : r = mid - 1);
}
return l;
}
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n;
t = n;
for(int i = 1; i <= n; ++i) {
cin >> a[i].x;
a[i].id = i;
}
sort(a + 1, a + n + 1, [](const Node &a, const Node &b) { return a.x < b.x; });
for(int i = 1; i < n; ++i) {
int x = Binary_Search();
(x - s + 1 < t - x ? s++ : t--);
}
cout << a[s].id;
return 0;
}
总结
水题。
题目描述
定义两个数字
思路
我们先看一个混乱度为
如果反转
如果反转
由于反转是相互独立的,所以我们可以枚举每种反转看是否需要。
空间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = 100001;
int n, a[MAXN];
ll k;
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> k;
a[1] = 1, k -= n - 1;
int l = 2, r = n;
for(int i = 2; l != r; ++i) {
if(n - i <= k) {
k -= n - i;
a[r] = i;
if(r > l) {
r--;
}else {
r++;
}
swap(l, r);
}else {
a[l] = i;
if(r < l) {
l--;
}else {
l++;
}
}
}
a[l] = n;
for(int i = 1; i <= n; ++i) {
cout << a[i] << " ";
}
return 0;
}
总结
比较简单,但要记得 long long
,而且考场上没做出来。
题目描述
有一排士兵,每个士兵都有一个默契值
思路
定义
由于状态不能优化,所以考虑优化转移:定义
这个
时空复杂度均为
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2001;
int n, a[MAXN], dp[MAXN][MAXN], f[MAXN][32], ans = 1;
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> a[i];
}
for(int i = 1; i <= n; ++i) {
dp[i][0] = 1;
}
for(int i = 1; i <= n; ++i) {
for(int j = 0; j < i; ++j) {
for(int k = 0; k < 32; ++k) {
if(!j || (((a[i] & a[j]) >> k) & 1)) {
f[i][k] = max(f[i][k], dp[i][j]);
}
}
ans = max(ans, dp[i][j]);
}
for(int j = i + 1; j <= n; ++j) {
for(int k = 0; k < 32; ++k) {
if((a[j] >> k) & 1) {
dp[j][i] = max(dp[j][i], f[i][k] + 1);
}
}
}
}
cout << ans;
return 0;
}
总结
这道题需要一些思考,考场上未做出。
题目描述
在 十分有信心已经
若不可能则输出
思路
这道题如果去掉电脑升级就十分简单,所以我们来考虑如何去掉这个限制。
我们可以对每个人要求的级数进行排序,这样要求最大的一定是最后一个人。所以就可以省掉这个状态了。
dp:
加个降维优化就可以了。
空间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = 101, MAXV = (1 << 21);
const ll INF = (ll)(2e18);
struct Node {
int x, k, res;
}s[MAXN];
int n, m, b;
ll dp[MAXV], ans = INF;
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> m >> b;
for(int i = 1, k; i <= n; ++i) {
cin >> s[i].x >> s[i].k >> k;
for(int j = 1, x; j <= k; ++j) {
cin >> x;
s[i].res |= (1 << (x - 1));
}
}
sort(s + 1, s + n + 1, [](const Node &a, const Node &b) { return a.k < b.k; });
for(int i = 1; i < (1 << m); ++i) {
dp[i] = INF;
}
dp[0] = 0;
for(int i = 1; i <= n; ++i) {
for(int j = (1 << m) - 1; j >= 0; --j) {
dp[j | s[i].res] = min(dp[j | s[i].res], dp[j] + s[i].x);
}
ans = min(ans, dp[(1 << m) - 1] + 1ll * s[i].k * b);
}
cout << (ans == INF ? -1 : ans);
return 0;
}
总结
需要注意 long long
,
本文作者:Yaosicheng124
本文链接:https://www.cnblogs.com/yaosicheng124/p/18280160
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步