题目描述
著名第一人称射击游戏 csgo 因其优秀的平衡性,爽快的射击感和科学的战术配比赢得了世界广大玩家的好评。 在一局游戏中,分为两个阵营,他们的目标就是消灭全部的对方敌人。
现在你是其中的一名玩家,不幸的是,你突然遭遇了许多个站成一横排,身高不同的敌人。
这种时候,用武器瞄准对方的头部进行 “爆头”(一击必杀)是化解险境的唯一方法。
不幸的是,你手中的武器由于过于老旧而后坐力巨大。(而且放浪的你还不喜欢压枪)
也就是说,在一轮扫射中,第一发子弹可以向任意高度水平射出,但是之后每发子弹射出的高度都不能低于前一发子弹射出的高度。(我们假设子弹在飞行中一直沿水平方向飞行,不会下落)
我们假定你无需考虑换弹问题,并且你是一名神枪手,拥有一颗子弹就可以对一个敌人进行“爆头”的能力,不会打空枪 。然而放浪的你有一个坏习惯,就是只喜欢从左向右扫射。
那么为了快速解决掉前方的所有敌人,请问你至少需要进行几轮扫射?
输入格式
本题输入若干组数据,每组数据分为两行。
第一行有一个整数 n,表示你面前遇到敌人的数量(1≤n≤10000)
第二行有 nn 个整数hi ,(1≤h i<MAX_INT)表示每个敌人的身高(认为头部的高度等于身高)
输出格式
一个整数,表示最少消灭全部敌人需要的扫射轮数
输出时每行末尾的多余空格,不影响答案正确性
样例输入
5
1 1 1 1 1
5
1 2 4 3 5
样例输出
1
2
思路:每次输入一个身高时看能放到哪个队尾,要选择队尾小于该数并且差距最小的,如果不能就重新开辟队列,看最后有多少队列。我的队列是用vector实现的。
AC代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <set>
#define eps 0.0000000001
#define inf 0x3f3f3f3f
const int M=1e4+10;
using namespace std;
typedef long long ll;
vector<int> v[M];
int main()
{
int n,i,j,a;
while(cin>>n)
{
int e=0;
cin>>a;
v[0].push_back(a);
e=1;
for(i=1; i<n; i++)
{
cin>>a;
int p=-1,minn=-1;
for(j=0; j<e; j++)
{
int len = v[j].size();
if(a >= v[j][len-1])
{
if(v[j][len-1] >= minn)
{
p=j;
minn=v[j][len-1];
}
}
}
if(p>=0&&p<e)
v[p].push_back(a);
else
{
v[e].push_back(a);
e++;
}
}
cout<<e<<endl;
for(i=0;i<=e;i++)
v[i].clear();
}
return 0;
}