任务说明:贪心就是只考虑眼前的利益。对于我们人生来说太贪是不好的,不过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 }
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 }
P1208 [USACO1.3]混合牛奶 Mixing Milk
简单题直接做了