Greedy:Saruman's Army(POJ 3069)
2015-09-06
问题大意:萨鲁曼白想要让他的军队从sengard到Helm’s Deep,为了跟踪他的军队,他在军队中放置了魔法石(军队是一条线),魔法石可以看到前后距离为R的距离,为了让魔法石发挥最大的效益,魔法石戴在军人的身上,问你怎么才能使用最少的石头
问题很清晰,思路也很清晰,这道题挺典型的,就是贪心算法,
很容易想到的就是我们只用在距离内找到最后的点(人),然后把魔法石放到其上面就行了,然后依次类推,最后就可以达到最少的数量
具体可以以2R为一次循环,在前R的区间内我们找到要标记的点,然后移动R的距离,再来一次就可以了。很容易想到,画个图就可以了
#include <stdio.h>
#include <stdlib.h>
#define SWAP(a,b) { (*a)^=(*b);(*b)^=(*a);(*a)^=(*b);}
#define CUTOFF 20 typedef int Position; void Quick_Sort(Position *, Position, Position);
int Get_Pivot(Position, Position, Position,Position *);
void Insertion_Sort(Position *, Position, Position);
void Search(Position *, const int, const int); int main(void)
{
int R, T, i;
Position *Troops = NULL;
while (~scanf("%d%d", &R, &T)
&& R >=
&& T >= )
{
Troops = (Position *)malloc(sizeof(int)*T);
for (i = ; i < T; i++)
scanf("%d", &Troops[i]);
Quick_Sort(Troops, , T - );
Search(Troops, R, T);
free(Troops);
}
} int Get_Pivot(Position left, Position right, Position mid,Position *A)
{
if (A[left] > A[mid]) SWAP(&A[left], &A[mid]);
if (A[left] > A[right]) SWAP(&A[left], &A[right]);
if (A[mid] > A[right]) SWAP(&A[mid], &A[right]); SWAP(&A[mid], &A[right]);//隐藏枢纽元
return A[right];
} void Quick_Sort(Position *A, Position left, Position right)
{
Position i = left, j = right , mid = (left + right) / ;
int pivot;
if (right - left > CUTOFF)
{
pivot = Get_Pivot(left, right, mid, A);
while ()
{
while (A[--j] > pivot);
while (A[++i] < pivot);
if (i < j)
SWAP(&A[i], &A[j])
else break;
}
SWAP(&A[i], &A[right]);//重新显示枢纽元
Quick_Sort(A, left, i - );
Quick_Sort(A, i + , right);
}
else Insertion_Sort(A, left, right);//转插入排序
} void Insertion_Sort(Position *A, Position left, Position right)
{
Position i, j;
int tmp;
for (i = left; i <= right; i++)
{
tmp = A[i];
for (j = i; j > left && A[j - ] > tmp; j--)
A[j] = A[j - ];
A[j] = tmp;
}
} void Search(Position *Troops, const int R, const int T)
{
Position i = , mark, s, ans = ;
for (; i < T;)
{
s = Troops[i++];//获得区间的最左点
for (; i < T && Troops[i] <= s + R; i++);
mark = Troops[i - ];//在R内的最右点,标记
for (; i < T && Troops[i] <= mark + R; i++);
ans++;
}
printf("%d\n", ans);
}
Greedy:Saruman's Army(POJ 3069)的更多相关文章
- POJ 3069 Saruman's Army(萨鲁曼军)
POJ 3069 Saruman's Army(萨鲁曼军) Time Limit: 1000MS Memory Limit: 65536K [Description] [题目描述] Saruman ...
- POJ 3069 Saruman's Army (模拟)
题目连接 Description Saruman the White must lead his army along a straight path from Isengard to Helm's ...
- poj 3069 Saruman's Army(贪心)
Saruman's Army Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Tot ...
- Saruman's Army(贪心)
Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep tra ...
- 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)
Charm Bracelet POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...
- Scout YYF I(POJ 3744)
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5565 Accepted: 1553 Descr ...
- 广大暑假训练1(poj 2488) A Knight's Journey 解题报告
题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A (A - Children of the Candy Corn) ht ...
- Games:取石子游戏(POJ 1067)
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37662 Accepted: 12594 Descripti ...
- BFS 或 同余模定理(poj 1426)
题目:Find The Multiple 题意:求给出的数的倍数,该倍数是只由 1与 0构成的10进制数. 思路:nonzero multiple 非零倍数 啊. 英语弱到爆炸,理解不了题意... ...
随机推荐
- 【linux基础】第九周作业
1.详细描述一次加密通讯的过程,结合图示最佳. 加密通讯:A <--> B 1)A与 B通信,首先A.B双方都应该持有对方的公钥,即证书,并验证证书的合法性. 2)加密: i. A ...
- Android学习笔记02-Mac下编译java代码
在Mac OS上配置JDK 1.7. 一 下载 Mac版本的JDK1.7 从以下下载地址,下载Mac版本的JDk1.7 安装文件 jdk-7u79-macosx-x64.dmg. http://www ...
- POJ2676Sudoku(类似于八皇后)
Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16444 Accepted: 8035 Special ...
- MVC执行顺序
MVC在底层和传统的asp.net是一致的,在底层之上,相关流程如下: 1)Global.asax里,MvcApplication对象的Application_Start()事件中,调用 RouteC ...
- MySQL中concat函数
MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...
- 修复VirtualBox "This kernel requires the following features not present on the CPU: pae Unable to boot
问题描述: 1.机器:Linux主机,特别是主机为大内存,比如: 4G内存的使用pae内核的Ubuntu系统的dell电脑. 2.情况:使用VirtualBox安装Linux系统时,比如:通过Virt ...
- Kd-tree算法原理
参考资料: Kd Tree算法原理 Kd-Tree,即K-dimensional tree,是一棵二叉树,树中存储的是一些K维数据.在一个K维数据集合上构建一棵Kd-Tree代表了对该K维数据集合构成 ...
- windows2003安全加固
因为IIS的方便性和易用性,使它成为最受欢迎的Web服务器软件之一.但是,IIS的安全性却一直令人担忧.如何利用IIS建立一个安全的Web服务器,是很多人关心的话题.要创建一个安全可靠的Web服务器, ...
- NC反弹CMDSHELL提权总结
Server-U等都不可以用的情况下. 一般都可思考用此方法不过这种方法, 只要对方装了防火墙, 或是屏蔽掉了除常用的那几个端口外的所有端口… 那么这种方法也失效了…. 1:通过shell将上 ...
- C语言绘制余弦函数图象
#include"stdio.h" #include"math.h" void main() { double y; int x,m; for(y=1;y> ...