1、压路机最少滚动次数
贪心+一遍遍历
int solution(vector<int> &X, vector<int> &Y, int W) {
// write your code in C++ (C++14 (g++ 6.2.0))
sort(X.begin(), X.end());
int res = 1, left = X[0]+W;
for (int i=1; i<X.size(); i++) {
if (X[i] > left) {
res++;
left = X[i] + W;
}
}
return res;
}
2、可以构成的最大回文字符串
map保存后遍历
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
string solution(string S) {
// write your code in C++ (C++14 (g++ 6.2.0))
vector<int> mp(10,0);
int n = S.size();
for (int i=0; i<n; i++) {
mp[S[i]-'0']++;
}
string res = "";
for (int i=9; i>=1; i--) {
while (mp[i] >= 2) {
res += (i+'0');
mp[i] -= 2;
}
}
if (res.size() >0) {
while (mp[0] >= 2) {
res += '0';
mp[0] -= 2;
}
}
char x = ' ';
for (int i=9; i>=0; i--) {
if (mp[i] > 0) {
x = i+'0';
break;
}
}
string res1 = res;
reverse(res1.begin(), res1.end());
if (x == ' ') {
res = res+res1;
} else {
res = res+x+res1;
}
return res;
}
3、树相关问题
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int total_value = 0;
int value(int sum) {
if (sum%5 == 0) {
return sum/5;
} else {
return sum/5+1;
}
}
int getPointRes(vector<vector<int>> &mp, vector<bool> &flag,int index) {
flag[index] = true;
int n = flag.size();
int sum = 1;
for (int i=0 ;i<n ;i++) {
if (mp[index][i] == 1 && !flag[i]) {
sum += getPointRes(mp, flag, i);
}
}
if (index != 0) {
total_value += value(sum);
}
return sum;
}
int solution(vector<int> &A, vector<int> &B) {
// write your code in C++ (C++14 (g++ 6.2.0))
int n = A.size();
vector<vector<int>> mp(n+1, vector(n+1, 0));
vector<bool> flag(n+1,false);
for (int i=0 ; i<n; i++) {
mp[A[i]][B[i]] = 1;
mp[B[i]][A[i]] = 1;
}
getPointRes(mp, flag, 0);
return total_value;
}
int main() {
vector<int> x = {1,1,1,9,9,9,9,7,8};
vector<int> y = {2,0,3,1,6,5,4,0,0};
cout << solution(x,y) << endl;
}