1. 题目
有 n 只怪兽和一个奥特曼,奥特曼和怪兽都有5个属性值。 当且仅当奥特曼的5个属性值都不小于怪兽时,奥特曼可以杀死怪兽。 当一个怪兽被杀掉时,这个怪兽的5个属性会增加到奥特曼身上。 请问奥特曼最多可以杀死多少怪兽?
代码语言:javascript复制样例 1:
输入: n = 2, v = [[1,1,1,1,1],[1,1,1,1,1],[2,2,2,2,2]]
输出: 2
解释: 奥特曼先杀死了怪兽 v[1], 然后他的属性值变成了 [2,2,2,2,2]. 之后奥特曼可以杀死怪兽 v[2].
样例 2:
输入: n = 5, v = [[3,9,2,1,5],[0,9,6,5,9],[6,1,8,6,3],[3,7,0,4,4],[9,9,0,6,5],[5,6,5,6,7]]
输出: 0
解释: 奥特曼无法杀死任何一个怪物.
注意事项
v[0][0]-v[0][4] 代表奥特曼的5个属性 。v[1]-v[n] 代表 n 个怪兽的5个属性 。
2. 解题
- 想着用优先队列,但是不会写,比较函数,有大佬看见,请赐教!
- 本题使用普通队列,蛮力法,依次扫描队列,最坏 O(n2) 时间复杂度
class Solution {
public:
int killMonster(int n, vector<vector<int>> &v) {
vector<int> ot = v[0];//奥特曼
queue<vector<int>> q;
int count = 0, i;
for(i = 1; i < v.size(); i)
q.push(v[i]);//怪兽队列
vector<int> tp;
bool eat = true;
while(eat)
{
eat = false;
for(i = 0; i < q.size(); i)
{
tp = q.front();
if(ot[0]>=tp[0]&&ot[1]>=tp[1]&&ot[2]>=tp[2]&&ot[3]>=tp[3]&&ot[4]>=tp[4])
{
count ;
eat = true;
q.pop();//吃了,删掉怪兽
ot[0] = tp[0];//属性加上
ot[1] = tp[1];
ot[2] = tp[2];
ot[3] = tp[3];
ot[4] = tp[4];
break;//重新扫描队列
}
else
{
q.push(tp);//回到队尾
q.pop();
}
}
if(eat == false)//一轮下来没吃着
break;//打败不了任何一个,退出
}
return count;
}
};
100% 数据通过测试 总耗时 50 ms 您的提交打败了 63.72% 的提交!