【Luogu】【关卡2-6】贪心(2017年10月)

任务说明:贪心就是只考虑眼前的利益。对于我们人生来说太贪是不好的,不过oi中,有时是对的。

P1090 合并果子

有N堆果子,只能两两合并,每合并一次消耗的体力是两堆果子的权重和,问最小消耗多少体力。

直接贪心,每次取两堆权重最小的果子合并,注意不能在一个for循环里面sort,这样是O(N^2logN);会TLE。

我AC的方法是第一遍sort,在循环里面用插入排序。(也有其他方法用优先队列,二叉堆什么的,不会写)

poj有个一样的题目3253 Fence Repair。然后shi哥那本书里也有讲这个题。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <vector>
 5 #include <cstring>
 6 #include <map>
 7 #include <climits>
 8 #include <algorithm>
 9 #include <cmath>
10 #include <sstream>
11 
12 using namespace std;
13 
14 const int INF = 1000000;
15 /*
16 void print(vector<int>& vec) {
17     printf("==========begin debug========
");
18     for(auto ele : vec) {
19         printf("%d ", ele);
20     }
21     printf("

");
22 }
23 */
24 
25 int main() {
26     int n;
27     cin >> n;
28     vector<int> vec(n);
29     for(int i = 0; i < n; ++i) {
30         cin >> vec[i];
31     }
32     long long ans = 0;
33     //[1]快排
34     sort(vec.begin(), vec.end());
35     //[2]里面做插入排序
36     for(int i = 1; i < n; ++i) {
37         int b = vec[i-1] + vec[i];
38         vec[i] = b, vec[i-1] = 0;
39         ans += b;
40         int j = i + 1;
41         while( j < n && vec[j] <= b) {
42             vec[j-1] = vec[j];
43             ++j;
44         }
45         vec[j-1] = b;
46         //print(vec);
47     }
48     cout << ans << endl;
49 
50     return 0;
51 }
View Code

P1181 数列分段Section I

给一个n个元素的数组,和一个数字m,问最少能把这个数组分成几段,每段的和小于等于m。

直接贪心。

第一次提交全WA。注意写法。这种题目一层循环就好了,写两层完全错。

第二次提交AC了。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <vector>
 5 
 6 using namespace std;
 7 
 8 int main() {
 9     int ans = 0;
10     int n;
11     long long m;
12     cin >> n >> m;
13     vector<long long> vec(n);
14     for(int i = 0; i < n; ++i) {
15         cin >> vec[i];
16     }
17     int start = 0;
18     long long summ = 0;
19     for (int i = start; i < n; ++i) {
20         if (summ + vec[i] > m) {
21             ++ans;
22             summ = 0;
23             --i;
24         } else {
25             summ += vec[i];
26         }
27     }
28     if (summ != 0) {
29         ++ans;
30     }
31     cout << ans << endl;
32     return 0;
33 }
View Code

P1208 [USACO1.3]混合牛奶 Mixing Milk

简单题直接做了

原文地址:https://www.cnblogs.com/zhangwanying/p/7634699.html