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;}