• 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 }
  • 相关阅读:
    阿里云ECS安装sqlserver,本地无法连接问题排查思路
    1433端口无法连接(sql server 数据库无法访问问题)解决思路
    开源框架 电商参考系统
    版本控制工具 Git 只下载开源项目的某个文件夹
    VUE 在idea中的运行项目
    开源框架 Java Guns 03 数据库替换为sqlite
    SQL Server 用ip地址登录 127.0.0.1
    开源框架 UI框架
    电商 电商系统汇总
    电商 平台汇总
  • 原文地址:https://www.cnblogs.com/Philip-Tell-Truth/p/4786940.html
Copyright © 2020-2023  润新知