贪心算法就是遵循某种规则,不断贪心地选取当前最优策略的算法设计方法.

硬币问题

image.png
贪心策略: 贪最大币值就行

区间问题

image.png
image.png
贪心策略: 贪结束时间最早的工作

字典序最小问题

image.png
贪心策略:贪左右字典序最小的那个字母(相同则比较下一个)

  1. #include<iostream>
  2. #define MAX_N 2000
  3. using namespace std;
  4. int N;
  5. char s[MAX_N+1];
  6. int main() {
  7. cin >> N;
  8. int i=0;
  9. while(i < N) {
  10. cin >> s[i];
  11. i++;
  12. }
  13. int a = 0, b=N-1;
  14. while (a <= b)
  15. {
  16. bool left = false;
  17. for (int i=0; a+i <=b; i++) {
  18. if (s[a+i] < s[b-i]) {
  19. left = true;
  20. break;
  21. } else if (s[a+i] > s[b-i]) {
  22. left = false;
  23. break;
  24. }
  25. }
  26. if(left) cout << s[a++];
  27. else cout << s[b--];
  28. if (N>80 && (a+N-b-1) % 80 == 0) cout << endl;
  29. }
  30. cout << endl;
  31. return 0;
  32. }

其他例题

Saruman’s Army

http://poj.org/problem?id=3069
从左边开始一直贪最大的R

  1. #include<iostream>
  2. #include<algorithm>
  3. #define MAX_N 1000
  4. using namespace std;
  5. int N, R;
  6. int X[MAX_N+1];
  7. void solve() {
  8. cin >> R >> N;
  9. while (N !=-1 && R !=-1) {
  10. for(int i=0; i<N; i++) cin >> X[i];
  11. sort(X, X+N);
  12. int i=0, res = 0;
  13. while (i<N) {
  14. // s是没有覆盖的最左边的点
  15. int s = X[i++];
  16. while(i<N && X[i] <= s+R) i++;
  17. // p是新加上标记的点
  18. int p = X[i-1];
  19. while (i<N && X[i] <= p+R) i++;
  20. res++;
  21. }
  22. cout << res << endl;
  23. cin >> R >> N;
  24. }
  25. }
  26. int main() {
  27. solve();
  28. return 0;
  29. }