Skip to content

20018: 蚂蚁王国的越野跑

http://cs101.openjudge.cn/practice/20018/

cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Fenwick
{
private:
    int n;
    vector<int> tree;

public:
    Fenwick(int n) : n(n), tree(n + 1, 0) {}

    void update(int i)
    {
        while (i <= n)
        {
            ++tree[i];
            i += (i & -i);
        }
    }

    long long query(int i)
    {
        long long s = 0;
        while (i > 0)
        {
            s += tree[i];
            i &= i - 1;
        }
        return s;
    }
};

int main()
{
    cin.tie(nullptr)->sync_with_stdio(false);

    int N;
    cin >> N;
    vector<int> v(N), vals(N);
    for (int i = 0; i < N; ++i)
    {
        int ipt;
        cin >> ipt;
        v[i] = ipt, vals[i] = ipt;
    }

    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());

    Fenwick BIT(N);

    long long ans = 0;
    for (const auto &x : vals)
    {
        int r = lower_bound(v.begin(), v.end(), x) - v.begin() + 1;
        ans += BIT.query(r - 1);
        BIT.update(r);
    }

    cout << ans << '\n';
    return 0;
}

M20744: 土豪购物

dp, greedy, http://cs101.openjudge.cn/pctbook/M20744/

思路:很标准的dp题目,把两种可能的情况都考虑进取就行,练习从底向上的dp写法

cpp
#include<vector>
#include<stdio.h>
using namespace std;
int max(int a,int b){
    return(a>b)?a:b;
}
int min(int a,int b){
    return(a<b)?a:b;
}
int main(){
    int p,q;
    q=1;
    char s=',';
    vector<int> w;
    while(q!=-1){
        scanf("%d",&p);
        w.push_back(p);
        q=scanf("%c",&s);//最后会读到一个换行
    }
    int n=w.size();
    vector<pair<int,int>>dp(n,{-100000,-100000});
    dp[n-1].first=w[n-1];
    dp[n-3].second=w[n-1]+w[n-3];
    for(int i=n-2;i>=0;i--){
        dp[i].first=max(w[i],dp[i+1].first+w[i]);
        if(i<n-3){        dp[i].second=max(dp[i+2].first,dp[i+1].second)+w[i];
        }
    }
    int ans=-100000;
    for(int i=0;i<n;i++){
        ans=max(ans,max(dp[i].first,dp[i].second));
    }
    printf("%d",ans);
    return 0;
}