acwing周赛50

题目链接

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;
}
posted @ 2022-05-15 15:24  knowei  阅读(29)  评论(0编辑  收藏  举报