9.18 文远知行笔试2.5
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会爆内存,之前做过类似的就爆内存了 #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; }
#文远知行##笔试#