一、贪心算法概念
贪心算法通过做出一系列选择来求出问题的最优解,在每个决策点,它做出在当时看来最佳的选择。由此可见,贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择,但是对许多问题它都所得到的解都是全局最优解。
二、相关题目
第一题:Sicily 1198. Substring
题目及输入输出:
样例:
题意:给n个字符串,需要将他们拼接起来形成一个字典序最小的字符串
解决思路:重写比较函数,然后利用sort() 函数进行排序。字符串传递性的证明:字符间的比较用ASCII码,而字符串之间的比较就类似于多位数的比较(把字符看成个位数,字符串看成多位数),数字的比较是有传递性的,同时字符串也满足传递性。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
//重写比较函数,用两种方式连接两字符串,按得到的字符串字典序较小的情况来排序
//如果不重写比较函数,那么就是直接按字典序比较 a,b 的大小
//但是这样排序后将字符串连接起来的不一定是最小字典序
//比如:b,ba; 按字典排序后再连接起来是 bba, 但正确应该是 bab
bool compare(string s1, string s2) {
string r1 = s1 + s2;
string r2 = s2 + s1;
return r1 < r2;
}
int main() {
int t;
cin >> t;
while(t--) {
int n;
cin >> n;
string str[8];
for(int i = 0; i < n; i++) cin >> str[i];
//按重写的比较函数进行排序,使得排序后得到的字符串是字典序最小的
sort(str, str+n, compare);
for(int i = 0; i < n; i++) cout << str[i];
cout << endl;
}
return 0;
}