zoukankan      html  css  js  c++  java
  • Greedy:Saruman's Army(POJ 3069)

                   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
    ", ans);
    87 }
  • 相关阅读:
    单选按钮控件(Ridio Button)的使用
    带属性页的对话框
    异常处理与MiniDump详解(4) MiniDump
    单片机与嵌入式 以及ARM DSP FPGA 几个概念的理解
    VC更换图标文件
    http://user.qzone.qq.com/2413264738/2
    安装包安装 执行有相对路径的程序不能正确运行
    如何将 jar 包导入Maven 本地仓库
    19、访问者设计模式
    11、装饰器模式
  • 原文地址:https://www.cnblogs.com/Philip-Tell-Truth/p/4786940.html
Copyright © 2011-2022 走看看