MMT1. 交叉线
描述
输入描述
输入的第一行包含一个整数T (1 ≤ T ≤ 10)表示有T组样例。输出描述
对于每个输入文件,输出T行。示例1
输入:
2 4 0 10 5 15 4 0 15 5 10
输出:
y n
C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2020-10-31
#include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> using namespace std; bool func(int n, int* nums) { int i, j; int out_b[2] = { -2000000, 2000000 }; int in_b[2] = { 0 }; int flag, flag_before; for (i = 1; i < n; i++) { flag = nums[i] < nums[i - 1]; if (i == 1) { flag_before = flag; continue; } if (flag == flag_before) { if (nums[i] < out_b[0] || nums[i] > out_b[1]) return true; if (in_b[0] == 0 && in_b[1] == 0) { in_b[0] = min(nums[i-2], nums[i - 1]); in_b[1] = max(nums[i-2], nums[i - 1]); } else { in_b[0] = min(nums[i - 1], in_b[0]); in_b[1] = max(nums[i - 1], in_b[1]); } } else if (flag != flag_before) { if (nums[i] > in_b[0] && nums[i] < in_b[1]) return true; if (nums[i] < out_b[0] || nums[i] > out_b[1]) return true; int left = min(nums[i - 1], nums[i - 2]); int right = max(nums[i - 1], nums[i - 2]); if (nums[i] > left && nums[i] < right) { out_b[0] = left; out_b[1] = right; in_b[0] = 0; in_b[1] = 0; } else { if (in_b[0] == 0 && in_b[1] == 0) { in_b[0] = left; in_b[1] = right; } else { in_b[0] = min(nums[i - 1], in_b[0]); in_b[1] = max(nums[i - 1], in_b[1]); } } } flag_before = flag; } return false; } int main() { int T, n; scanf("%d", &T); for (int i = 0; i < T; i++) { scanf("%d", &n); int* nums = new int[n]; for (int j = 0; j < n; j++) scanf("%d", &nums[j]); if (func(n, nums)) printf("y\n"); else printf("n\n"); delete[] nums; } return 0; }
C++ 解法, 执行用时: 4ms, 内存消耗: 380KB, 提交时间: 2020-10-31
#include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> using namespace std; bool func(int n, int* nums) { int i, j; int out_b[2] = { -2000000, 2000000 }; int in_b[2] = { 0 }; int flag, flag_before; for (i = 1; i < n; i++) { flag = nums[i] < nums[i - 1]; if (i == 1) { flag_before = flag; continue; } if (flag == flag_before) { if (nums[i] < out_b[0] || nums[i] > out_b[1]) return true; if (in_b[0] == 0 && in_b[1] == 0) { in_b[0] = min(nums[i-2], nums[i - 1]); in_b[1] = max(nums[i-2], nums[i - 1]); } else { in_b[0] = min(nums[i - 1], in_b[0]); in_b[1] = max(nums[i - 1], in_b[1]); } } else if (flag != flag_before) { if (nums[i] > in_b[0] && nums[i] < in_b[1]) return true; if (nums[i] < out_b[0] || nums[i] > out_b[1]) return true; int left = min(nums[i - 1], nums[i - 2]); int right = max(nums[i - 1], nums[i - 2]); if (nums[i] > left && nums[i] < right) { out_b[0] = left; out_b[1] = right; in_b[0] = 0; in_b[1] = 0; } else { if (in_b[0] == 0 && in_b[1] == 0) { in_b[0] = left; in_b[1] = right; } else { in_b[0] = min(nums[i - 1], in_b[0]); in_b[1] = max(nums[i - 1], in_b[1]); } } } flag_before = flag; } return false; } int main() { int T, n; scanf("%d", &T); for (int i = 0; i < T; i++) { scanf("%d", &n); int* nums = new int[n]; for (int j = 0; j < n; j++) scanf("%d", &nums[j]); if (func(n, nums)) printf("y\n"); else printf("n\n"); delete[] nums; } return 0; }
C++ 解法, 执行用时: 4ms, 内存消耗: 400KB, 提交时间: 2020-11-01
#include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> using namespace std; bool func(int n, int* nums) { int i, j; int out_b[2] = { -2000000, 2000000 }; int in_b[2] = { 0 }; int flag, flag_before; for (i = 1; i < n; i++) { flag = nums[i] < nums[i - 1]; if (i == 1) { flag_before = flag; continue; } if (flag == flag_before) { if (nums[i] < out_b[0] || nums[i] > out_b[1]) return true; if (in_b[0] == 0 && in_b[1] == 0) { in_b[0] = min(nums[i-2], nums[i - 1]); in_b[1] = max(nums[i-2], nums[i - 1]); } else { in_b[0] = min(nums[i - 1], in_b[0]); in_b[1] = max(nums[i - 1], in_b[1]); } } else if (flag != flag_before) { if (nums[i] > in_b[0] && nums[i] < in_b[1]) return true; if (nums[i] < out_b[0] || nums[i] > out_b[1]) return true; int left = min(nums[i - 1], nums[i - 2]); int right = max(nums[i - 1], nums[i - 2]); if (nums[i] > left && nums[i] < right) { out_b[0] = left; out_b[1] = right; in_b[0] = 0; in_b[1] = 0; } else { if (in_b[0] == 0 && in_b[1] == 0) { in_b[0] = left; in_b[1] = right; } else { in_b[0] = min(nums[i - 1], in_b[0]); in_b[1] = max(nums[i - 1], in_b[1]); } } } flag_before = flag; } return false; } int main() { int T, n; scanf("%d", &T); for (int i = 0; i < T; i++) { scanf("%d", &n); int* nums = new int[n]; for (int j = 0; j < n; j++) scanf("%d", &nums[j]); if (func(n, nums)) printf("y\n"); else printf("n\n"); delete[] nums; } return 0; }
C++ 解法, 执行用时: 4ms, 内存消耗: 504KB, 提交时间: 2020-07-28
#include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> using namespace std; bool func(int n, int* nums) { int i, j; int out_b[2] = { -2000000, 2000000 }; int in_b[2] = { 0 }; int flag, flag_before; for (i = 1; i < n; i++) { flag = nums[i] < nums[i - 1]; if (i == 1) { flag_before = flag; continue; } if (flag == flag_before) { if (nums[i] < out_b[0] || nums[i] > out_b[1]) return true; if (in_b[0] == 0 && in_b[1] == 0) { in_b[0] = min(nums[i-2], nums[i - 1]); in_b[1] = max(nums[i-2], nums[i - 1]); } else { in_b[0] = min(nums[i - 1], in_b[0]); in_b[1] = max(nums[i - 1], in_b[1]); } } else if (flag != flag_before) { if (nums[i] > in_b[0] && nums[i] < in_b[1]) return true; if (nums[i] < out_b[0] || nums[i] > out_b[1]) return true; int left = min(nums[i - 1], nums[i - 2]); int right = max(nums[i - 1], nums[i - 2]); if (nums[i] > left && nums[i] < right) { out_b[0] = left; out_b[1] = right; in_b[0] = 0; in_b[1] = 0; } else { if (in_b[0] == 0 && in_b[1] == 0) { in_b[0] = left; in_b[1] = right; } else { in_b[0] = min(nums[i - 1], in_b[0]); in_b[1] = max(nums[i - 1], in_b[1]); } } } flag_before = flag; } return false; } int main() { int T, n; scanf("%d", &T); for (int i = 0; i < T; i++) { scanf("%d", &n); int* nums = new int[n]; for (int j = 0; j < n; j++) scanf("%d", &nums[j]); if (func(n, nums)) printf("y\n"); else printf("n\n"); delete[] nums; } return 0; }
C++14 解法, 执行用时: 4ms, 内存消耗: 628KB, 提交时间: 2020-05-19
#include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> using namespace std; bool func(int n, int* nums) { int i, j; int out_b[2] = { -2000000, 2000000 }; int in_b[2] = { 0 }; int flag, flag_before; for (i = 1; i < n; i++) { flag = nums[i] < nums[i - 1]; if (i == 1) { flag_before = flag; continue; } if (flag == flag_before) { if (nums[i] < out_b[0] || nums[i] > out_b[1]) return true; if (in_b[0] == 0 && in_b[1] == 0) { in_b[0] = min(nums[i-2], nums[i - 1]); in_b[1] = max(nums[i-2], nums[i - 1]); } else { in_b[0] = min(nums[i - 1], in_b[0]); in_b[1] = max(nums[i - 1], in_b[1]); } } else if (flag != flag_before) { if (nums[i] > in_b[0] && nums[i] < in_b[1]) return true; if (nums[i] < out_b[0] || nums[i] > out_b[1]) return true; int left = min(nums[i - 1], nums[i - 2]); int right = max(nums[i - 1], nums[i - 2]); if (nums[i] > left && nums[i] < right) { out_b[0] = left; out_b[1] = right; in_b[0] = 0; in_b[1] = 0; } else { if (in_b[0] == 0 && in_b[1] == 0) { in_b[0] = left; in_b[1] = right; } else { in_b[0] = min(nums[i - 1], in_b[0]); in_b[1] = max(nums[i - 1], in_b[1]); } } } flag_before = flag; } return false; } int main() { int T, n; scanf("%d", &T); for (int i = 0; i < T; i++) { scanf("%d", &n); int* nums = new int[n]; for (int j = 0; j < n; j++) scanf("%d", &nums[j]); if (func(n, nums)) printf("y\n"); else printf("n\n"); delete[] nums; } return 0; }