2015-09-06
问题大意:萨鲁曼白想要让他的军队从sengard到Helm’s Deep,为了跟踪他的军队,他在军队中放置了魔法石(军队是一条线),魔法石可以看到前后距离为R的距离,为了让魔法石发挥最大的效益,魔法石戴在军人的身上,问你怎么才能使用最少的石头
问题很清晰,思路也很清晰,这道题挺典型的,就是贪心算法,
很容易想到的就是我们只用在距离内找到最后的点(人),然后把魔法石放到其上面就行了,然后依次类推,最后就可以达到最少的数量
具体可以以2R为一次循环,在前R的区间内我们找到要标记的点,然后移动R的距离,再来一次就可以了。很容易想到,画个图就可以了
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define SWAP(a,b) { (*a)^=(*b);(*b)^=(*a);(*a)^=(*b);} 4 #define CUTOFF 20 5 6 typedef int Position; 7 8 void Quick_Sort(Position *, Position, Position); 9 int Get_Pivot(Position, Position, Position,Position *); 10 void Insertion_Sort(Position *, Position, Position); 11 void Search(Position *, const int, const int); 12 13 int main(void) 14 { 15 int R, T, i; 16 Position *Troops = NULL; 17 while (~scanf("%d%d", &R, &T) 18 && R >= 0 19 && T >= 0) 20 { 21 Troops = (Position *)malloc(sizeof(int)*T); 22 for (i = 0; i < T; i++) 23 scanf("%d", &Troops[i]); 24 Quick_Sort(Troops, 0, T - 1); 25 Search(Troops, R, T); 26 free(Troops); 27 } 28 } 29 30 int Get_Pivot(Position left, Position right, Position mid,Position *A) 31 { 32 if (A[left] > A[mid]) SWAP(&A[left], &A[mid]); 33 if (A[left] > A[right]) SWAP(&A[left], &A[right]); 34 if (A[mid] > A[right]) SWAP(&A[mid], &A[right]); 35 36 SWAP(&A[mid], &A[right]);//隐藏枢纽元 37 return A[right]; 38 } 39 40 void Quick_Sort(Position *A, Position left, Position right) 41 { 42 Position i = left, j = right , mid = (left + right) / 2; 43 int pivot; 44 if (right - left > CUTOFF) 45 { 46 pivot = Get_Pivot(left, right, mid, A); 47 while (1) 48 { 49 while (A[--j] > pivot); 50 while (A[++i] < pivot); 51 if (i < j) 52 SWAP(&A[i], &A[j]) 53 else break; 54 } 55 SWAP(&A[i], &A[right]);//重新显示枢纽元 56 Quick_Sort(A, left, i - 1); 57 Quick_Sort(A, i + 1, right); 58 } 59 else Insertion_Sort(A, left, right);//转插入排序 60 } 61 62 void Insertion_Sort(Position *A, Position left, Position right) 63 { 64 Position i, j; 65 int tmp; 66 for (i = left; i <= right; i++) 67 { 68 tmp = A[i]; 69 for (j = i; j > left && A[j - 1] > tmp; j--) 70 A[j] = A[j - 1]; 71 A[j] = tmp; 72 } 73 } 74 75 void Search(Position *Troops, const int R, const int T) 76 { 77 Position i = 0, mark, s, ans = 0; 78 for (; i < T;) 79 { 80 s = Troops[i++];//获得区间的最左点 81 for (; i < T && Troops[i] <= s + R; i++); 82 mark = Troops[i - 1];//在R内的最右点,标记 83 for (; i < T && Troops[i] <= mark + R; i++); 84 ans++; 85 } 86 printf("%d\n", ans); 87 }
时间: 2024-10-11 18:12:23