|
【试题】连号区间数 |
一派护法 十九级 |
#include <stdio.h> #include <stdlib.h> #include <string.h>
int sort(int *nums, int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (nums[j] == nums[j + 1]) return 0; if (nums[j] > nums[j + 1]) { temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } return 1; }
int main(void) { int i, j, k, n, *nums; int *arr; int len; unsigned long long count = 0; scanf_s("%d", &n); nums = (int *)malloc(n * sizeof(int)); for (i = 0; i < n; i++) scanf_s("%d", nums + i);
for (i = 0; i < n; i++) { for (j = i; j < n; j++) { len = j - i + 1; arr = (int *)malloc(len * sizeof(int)); memcpy(arr, nums + i, len * sizeof(int)); if (sort(arr, len)) { for (k = 1; k < len; k++) { if (arr[k] != arr[k - 1] + 1) break; } if (k == len) { //printf("[%d, %d]\n", i, j); count++; } } free(arr); } }
free(nums); printf("%I64u\n", count); return 0; }
|
一派护法 十九级 |
详细记录
评测点序号评测结果得分CPU使用内存使用下载评测数据
1 正确 20.00 15ms 1.601MB 输入 输出
2 正确 20.00 0ms 1.609MB VIP特权
3 正确 20.00 499ms 1.660MB VIP特权
4 运行超时 0.00 运行超时 1.683MB VIP特权
5 运行超时 0.00 运行超时 1.632MB VIP特权
得分60分
|
一派护法 十九级 |
#include <stdio.h> #include <stdlib.h> #include <string.h>
/*int sort(int *nums, int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (nums[j] == nums[j + 1]) return 0; if (nums[j] > nums[j + 1]) { temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } return 1; }*/
int main(void) { int i, j, k, n, *nums; int *arr; int len; unsigned long long count = 0; int min, max; scanf("%d", &n); nums = (int *)malloc(n * sizeof(int)); for (i = 0; i < n; i++) scanf("%d", nums + i);
for (i = 0; i < n; i++) { for (j = i; j < n; j++) { len = j - i + 1; /*arr = (int *)malloc(len * sizeof(int)); memcpy(arr, nums + i, len * sizeof(int)); if (sort(arr, len)) { for (k = 1; k < len; k++) { if (arr[k] != arr[k - 1] + 1) break; } if (k == len) { //printf("[%d, %d]\n", i, j); count++; } } free(arr);*/
min = max = nums[i]; for (k = 1; k < len; k++) { if (nums[i + k] < min) min = nums[i + k]; if (nums[i + k] > max) max = nums[i + k]; } //printf("[%d, %d], [%d, %d]\n", i + 1, j + 1, min, max); if (max - min == j - i) { //printf("[%d, %d]\n", i + 1, j + 1); count++; } } }
free(nums); printf("%I64u\n", count); return 0; } 得分: 80分
|
一派护法 十九级 |
#include <stdio.h> #include <stdlib.h> #include <string.h>
int main(void) { int i, j, k, n, *nums; unsigned long long count = 0; int min, max; scanf("%d", &n); nums = (int *)malloc(n * sizeof(int)); for (i = 0; i < n; i++) scanf("%d", nums + i);
for (i = 0; i < n; i++) { min = max = nums[i]; for (j = i; j < n; j++) { if (nums[j] < min) min = nums[j]; if (nums[j] > max) max = nums[j]; if (max - min == j - i) count++; } }
free(nums); printf("%I64u\n", count); return 0; } 得分: 100分
|
一派护法 十九级 |
因此,根本不需要排序,直接减最大最小值就行了
|