100// dfs 找最小// 贪心 !!!// 或者动态规划???#include <bits/stdc++.h>using namespace std;int main () {    vector<int>arr;    int a;    while (scanf("%d,", &a) != EOF) {        arr.push_back(a);    }    int len = arr.size();    // 用贪心,每次跳到数字最大的位置!!    if (len <= 1) {        cout<<0<<endl;        return 0;    }    int i = 0, cnt = 0;    while (true) {        if (i + arr[i] >= len - 1) {            cnt++;            break;        }        int maxNum = -1, maxIndex = -1;        for (int j = i + 1; j <= i + arr[i]; ++j) {            if (arr[j] + j >= maxNum + maxIndex) { // !!!! 这个贪心很重要                maxNum = arr[j];                maxIndex = j;            }        }        i = maxIndex;        cnt++;    }    cout<<cnt<<endl;//     vector<int>dp(len, len);//     dp[0] = 0;//     for (int i = 1; i < len; ++i) {//         for (int j = 0; j < i; ++j) {//             if (arr[j] + j >= i) {//                 dp[i] = min(dp[i], dp[j] + 1); // 由前面的状态扩展而来//             }//         }//     }//     cout<<dp[len - 1];//     for (int i : arr) {//         cout<<i<<endl;//     }    return 0;} 一开始选取思路就有问题,哎,麻了,只过了50,我以为取最大值做dp会爆内存,之前做过类似的就爆内存了[笑cry] #include <bits/stdc++.h>using namespace std;typedef struct course {    int l, r;    int val;    course() : l(0), r(0), val(0) {}}course;bool cmp (course c1, course c2) {    if (c1.l != c2.l) {        return c1.l < c2.l;    }//     else {//         if (c1.r != c2.r) {//             return c1.r < c2.r;//         }//         return c1.val > c2.val;//     }    return c1.r < c2.r;}int main () {    int n;    cin>>n;    vector<course>arr(n);    for (int i = 0; i < n; ++i) {        cin>>arr[i].l>>arr[i].r>>arr[i].val;    }    sort(arr.begin(), arr.end(), cmp);//    vector<bool>dele(n, false);//    int before = 0;//    int remain = 0;//    for (int i = 1; i < n; ++i) {//        before = i - 1;//        while (before >= 0 && dele[before]) {//            before--;//        }//        while (before >= 0 && arr[i].l >= arr[before].l && arr[i].r <= arr[before].r && arr[i].val >= arr[before].val) {//            dele[before] = true;//            remain++;//            before--;//        }//    }//    remain = n - remain;//    vector<course>arr2(n);//    int cc = 0;//    for (int i = 0; i < n; ++i) {//        if (dele[i]) {//            continue;//        }//        arr2[cc] = arr[i];//        ++cc;//    }    vector<long long>dp(n, 0);    dp[0] = arr[0].val;    long long res = 0;    int index = 0;    bool flag = false;    for (int i = 1; i < n; ++i) {        dp[i] = arr[i].val;        index = i - 1;        flag = false;        while (index >= 0) {            if (arr[index].r <= arr[i].l && dp[index] + arr[i].val > dp[i]) {                // 更新                flag = true;                dp[i] = dp[index] + arr[i].val;            }//             if (flag && index > 0 && arr[index].l > arr[index - 1].r && dp[index] > dp[index - 1]) {//                 break;//             }            --index;        }        res = max(res, dp[i]);    }//     for (long long i : dp) {//         res = max(res, i);//     }    cout<<res<<endl;    return 0;} 100#include <bits/stdc++.h>using namespace std;// 相当于求最小值// 用最小堆!!!然后给他相加,再扔回去!!要超时!!// 二分check!! 是否满足!!n 比较小!!!bool check(long long cnt, vector<long long> &arr, long long m) {    for (long long i : arr) {        if (i < cnt) {            m = m - (cnt - i);            if (m < 0) {                return false;            }        }    }    return true;}int main () {    int n;    long long m;    cin>>n>>m;    vector<long long>arr(n, 0);    long long l = 0, r = 0;    for (int i = 0; i < n; ++i) {        cin>>arr[i];        r = max(r, arr[i]);    }    r = r + m / n; // 一定要加这行!!!    long long mid = 0;    long long res = 0;    while (l <= r) {        mid = l + ((r - l) >> 1);        if (check(mid, arr, m)) {            l = mid + 1;            res = mid;        } else {            r = mid - 1;        }    }    cout<<(res == 0 ? -1 : res)<<endl;    return 0;}
点赞 2
评论 4
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务