POJ 3183 Stump Removal

爆炸算法解决伐木问题
本文探讨了如何使用一种特殊的爆炸算法来解决牧场上的伐木问题。通过精心设计的算法,确保了用最少的爆炸次数移除所有碍眼的树桩。文章详细介绍了算法的工作原理及其实现过程。

http://poj.org/problem?id=3183

Stump Removal
Time Limit:1000MS Memory Limit:65536K



Description

Always thinking of the cows' grazing experience, FJ has found that he must remove N (1 <= N <= 50,000) unsightly stumps from the pasture. The stumps are conveniently arranged in a straight line and numbered 1..N with each stump having some height H_i (1 <= H_i <= 10,000).

FJ will use the traditional high explosives to destroy the stumps. These high explosives are formulated to destroy adjacent stumps as long as those adjacent stumps are strictly shorter than the nearest stump being destroyed. The blast can continue past the closest adjacent stump to the next adjacent stump if it is even shorter than the nearest stump just destroyed. As soon as a stump encountered by the blast wave is not shorter, though, no more destruction occurs on that side of the target stump (the other side follows the same rules with whatever stumps might appear there).

Consider a line of nine stumps with these heights:

              1 2 5 4 3 3 6 6 2
If FJ blows up the third stump (with height 5), then the second stump will also be destroyed (height 2) and the first stump (height 1) will also be destroyed. Likewise, the fourth stump (height 4) and fifth stump (height 3) will be destroyed since they are successively shorter, leaving the line like this:

              * * * * * 3 6 6 2
Two more explosives (at stumps 7 and 8) will destroy the rest.

Help FJ determine the minimum number of explosive charges he needs to destroy the stumps.

Input

Line 1: A single integer, N

Lines 2..N+1: Line i+1 contains H_i

Output

Lines 1..?: Each line contains one integer which is the index of a stump to blow up. The indices must be listed in increasing order.

Sample Input

9
1
2
5
4
3
3
6
6
2

Sample Output

3
7
8
/* Author : yan
 * Question : POJ 3183 Stump Removal
 * Data && Time : Monday, January 03 2011 11:04 PM
*/
#include<stdio.h>
#define bool _Bool
#define true 1
#define false 0
#define MAX 50005
int hight[MAX];
int n;
int cache_index;

int highest(int *start)
{
	int _i;
	for(_i= *start;_i<n;_i++)
	{
		if(hight[_i]>=hight[_i+1])
		{
			cache_index=_i;
			break;
		}
	}
	while(hight[_i]>hight[_i+1]) _i++;
	*start=_i;
	return cache_index;
}
int main()
{
	//freopen("input","r",stdin);
	int i;
	int ans;
	int start=-1;
	scanf("%d",&n);
	for(i=0;i<n;i++) scanf("%d",&hight[i]);

	while(start<n)
	{
		start++;
		ans=highest(&start);
		printf("%d/n",ans+1);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值