【Codeforces Round #493 (Div. 2) B】Cutting

【链接】 我是链接,点我呀:)
【题意】

在这里输入题意

【题解】

显然只有在前i个位置奇数偶数出现次数都相同的地方才能切。 (且不管前面怎么切,这里都能切的。 那么就相当于有n个物品,每个物品的代价是|a[i]-a[i-1]|,然后价值是1. 因为价值是一样的。。所以肯定优先选价值最小的几个。。。 直接sort就可以了。。

【代码】

#include <bits/stdc++.h>

using namespace std;

const int N = 100;
const int INF = 1e8;

int pre[N+10][2],a[N+10],cost[N+10],cnt;
int n,B;

int main()
{
    #ifdef LOCAL_DEFINE
        freopen("rush.txt","r",stdin);
    #endif // LOCAL_DEFINE
    ios::sync_with_stdio(0),cin.tie(0);
    cin >> n >> B;
    for (int i = 1;i <= n;i++) cin >> a[i];
    for (int i = 1;i <= n;i++){
        for (int j = 0;j < 2;j++) pre[i][j] = pre[i-1][j];
        pre[i][a[i]&1]++;
    }
    for (int i = 1;i <= n-1;i++)
        if (pre[i][0]==pre[i][1]){
            cost[++cnt] = abs(a[i+1]-a[i]);
        }
    n = cnt;
    sort(cost+1,cost+1+cnt);
    for (int i = 1,j = 0;i <= cnt;i++){
        if (j+cost[i]>B){
            cout<<i-1<<endl;
            return 0;
        }
        j+=cost[i];
    }
    cout<<cnt<<endl;
    return 0;
}


原文地址:https://www.cnblogs.com/AWCXV/p/9733338.html