最少拦截系统
题目链接: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就可以得到下标了。
接下来就是正题了:我们首先开一个数组填上最大值,再遍历输入的数,每次都找到第一个比当前的数要来的大的数去替换,并记录下所替换的下标(我们没把一个值从最大替换为当前值就是开了一个新的拦截系统),在把这一个下标和当前存的下标取最大并存下来(最大的那个下标加就是我们开的拦截系统的个数)。
趁年轻别给自己后悔的机会,错过了就什么都来不及了。