滴滴编程题解C++
1.先求异或的“累异或”矩阵,类似累加,从i开始向后,一直找到异或成0的坐标。然后贪心求不重复区间。C+代码如下:
#include <iostream> using namespace std; int main() { int n = 0; cin >> n; int *num = new int[n]; int *num2 = new int[n]; for (int i = 0; i < n; ++i) num2[i] = -1; for (int i = 0; i < n; ++i) { cin >> num[i]; if (num[i] == 0) { num2[i] = i; continue; } for (int j = 0; j < i; ++j) { if (num2[j] == -1) { num[j] ^= num[i]; if (num[j] == 0) num2[j] = i; } } } int output = 0; int k = 0; while (k < n) { int min = n; for (int i = k; i < n; ++i) { if (num2[i] != -1 && num2[i] < min) { min = num2[i]; } } if(min == n) break; ++output; k = min + 1; } cout << output; return 0; }
2.剑指offer原题
#include <iostream> using namespace std; int getMin(int num1, int num2, int num3) { int min = num1 < num2 ? num1 : num2; min = min < num3 ? min : num3; return min; } int main() { int N = 0; cin >> N; if (N <= 0) { cout << 0; return 0; } int *num = new int[N]; num[0] = 1; int index = 1; int *num2 = num; int *num3 = num; int *num5 = num; while (index < N) { int min = getMin(*num2 * 2, *num3 * 3, *num5 * 5); num[index] = min; while (*num2 * 2 <= min) ++num2; while (*num3 * 3 <= min) ++num3; while (*num5 * 5 <= min) ++num5; ++index; } cout << num[N - 1]; return 0; }