acwing周赛50
题目链接
1.缺少的数
模拟 \(O(n)\)
可以使用桶排序,将未出现的字母输出即可
时间复杂度
遍历一次O(n)
C++代码
#include
#include
#include
using namespace std;
const int N = 1e5 + 10;
int n;
int num[N];
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
{
int a;
cin >> a;
num[a] = 1;
}
for(int i = 1; i <= n; i++)
{
if(!num[i])
{
cout << i;
return 0;
}
}
return 0;
}
2.4417. 选区间
算法(排序+模拟) \(O(nlogn)\)
题目大意是让我们找出最小可能值的最大值多少,如果区间存在交集那么距离为0,如果无交集,那么距离为l2-r1,找出这样距离的最大值。
我们可以将区间进行排序,分别遍历一类区间与二类区间,每次与另外一个区间区域的最后一个区间进行比较即可,因为无法确定是哪一个区间更大,所以遍历两次。
时间复杂度
排序时间复杂度为\(O(nlogn)\), 遍历为\(n\),所以总和为\(O(n)\)
C++代码
#include
#include
#include
using namespace std;
typedef pair PII;
const int N = 1e5 + 10;
int n, m;
vector ll, rr;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> n;
for(int i = 0; i < n; i++)
{
int a, b;
cin >> a >> b;
ll.push_back({a, b});
}
cin >> m;
for(int i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
rr.push_back({a, b});
}
sort(ll.begin(), ll.end());
sort(rr.begin(), rr.end());
int res = 0;
for(int i = 0; i < n; i++)
{
auto c = ll[i];
auto d = rr[m - 1];
res = max(res, d.first - c.second);
}
for(int i = 0; i < m; i++)
{
auto c = rr[i];
auto d = ll[n - 1];
res = max(res, d.first - c.second);
}
cout << res;
return 0;
}
3.选元素
动态规划
闫式dp分析法
状态表示:从前i个数选择j个数的集合,并且选择了第i个数的集合
状态计算:对于选择的第i个元素,那么我们j与j - 1的距离不应该大于k,也就可以得出i-k <= u < i
得出 dp[i][j] = max(dp[i][j], dp[u][j - 1] + v) (i - k u i)
时间复杂度
i*j*u,为\(O(n^3)\)
C++代码
#include
#include
#include
using namespace std;
const int N = 210;
typedef long long LL;
int n, k, x;
LL dp[N][N];
int main()
{
memset(dp, -0x3f, sizeof dp); //清空
cin >> n >> k >> x;
dp[0][0] = 0; //初始化为0
for(int i = 1; i <= n; i++)
{
int v;
cin >> v;
for(int j = 1; j <= x; j++)
for(int u = max(0, i - k); u < i; u++) //也许会小于0,所以与0做判断
dp[i][j] = max(dp[i][j], dp[u][j - 1] + v);
}
LL ans = -1;
for(int i = n - k + 1; i <= n; i++)
ans = max(ans, dp[i][x]);
cout << ans;
return 0;
}