ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

acwing周赛50

2022-05-15 15:33:49  阅读:184  来源: 互联网

标签:周赛 rr int ll 50 cin include dp acwing


题目链接

1.缺少的数

模拟 \(O(n)\)

可以使用桶排序,将未出现的字母输出即可

时间复杂度

遍历一次O(n)

C++代码

#include <iostream>
#include <cstring>
#include <algorithm>
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 <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 10;
int n, m;
vector<PII> 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 <iostream>
#include <cstring>
#include <algorithm>
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;
}

标签:周赛,rr,int,ll,50,cin,include,dp,acwing
来源: https://www.cnblogs.com/citurs/p/16273309.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有