HDU-1257 最少拦截系统

最少拦截系统

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257


题目大意:

总的来说就是首先会给你一个数n之后会给你n个数,需要你把这n个数分为最少的非上升序列。总的来说就是一题水题。


先上代码:

因为这题其实不难,代码量也少所以建议能不看解释也就不要看了。

#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <cstring>
#include <cmath>
#include <stdio.h>
#include <sstream>
const int INF=0x3f3f3f3f;
using namespace std;
int arr[100];
int n,t;
int main()
{
	while(cin>>n)
	{
		int ma=0;
		fill(arr,arr+100,INF);
		for(int a=0;a<n;a++)
		{
			cin>>t;
			int tt=lower_bound(arr,arr+100,t)-arr;
			ma=max(ma,tt);
			arr[tt]=t;
		}
		cout<<ma+1<<endl;
		
	}
}

接下来解释一波代码:

首先要解释一下lower_bound( )这个方法:lower_bound( begin,end,num)的三个参数分别是查找方位的起点终点以及基准数(叫法不知道对不对先这么叫着先哈)。这个方法会从begin的位置开始到end-1的位置为止找到第一个大于或等于num的数字。返回的是地址所以只要减去begin就可以得到下标了。

接下来就是正题了:我们首先开一个数组填上最大值,再遍历输入的数,每次都找到第一个比当前的数要来的大的数去替换,并记录下所替换的下标(我们没把一个值从最大替换为当前值就是开了一个新的拦截系统),在把这一个下标和当前存的下标取最大并存下来(最大的那个下标加就是我们开的拦截系统的个数)。


趁年轻别给自己后悔的机会,错过了就什么都来不及了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值