感觉NIO的题就恰到好处,刚好你能用暴力法写出来(但是无法通过),更好的方法又不会
5801. 消灭怪物的最大数量
https://leetcode-cn.com/contest/weekly-contest-248/problems/eliminate-maximum-number-of-monsters/
我的代码
class Solution {
public:
int kill(vector<int> m,int num,vector<int>& dist, vector<int>& speed){
int flag=0;//是否已经有一个0了
for(int i=0;i<dist.size();i++){
m.push_back(dist[i]-speed[i]);
if(flag==1&&m[i]<=0) break;
if(m[i]<=0) {
flag=1;//数组里已经有一个0 不能再出现一个0了
num++;//这个0被杀掉
m[i]=999;
}
}//m结束一轮循环之后要开始新的一轮
if(num==dist.size()) return num;
kill(m,num,dist,speed);
return num;
}
int eliminateMaximum(vector<int>& dist, vector<int>& speed) {
vector<int> m;
int num=0;//消灭的怪物数
return kill(m,num,dist,speed);
}
};
大佬代码
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
class Solution {
public:
int eliminateMaximum(vector<int>& dist, vector<int>& speed) {
vector<double> t;
for (int i = 0; i < dist.size(); ++i) {
t.push_back(double(dist[i]) / speed[i]);
}
sort(t.begin(), t.end());
int ans = 0;
for (int i = 0; i < dist.size(); ++i) {
if (t[i] > i) ++ans;
else return ans;
}
return ans;
}
};
int main(){
Solution a;
vector<int> dist = { 1,3,4 };
vector<int> speed = { 1,1,1 };
cout<<a.eliminateMaximum(dist,speed);
system("pause");
return 0;
}
这个方法很有意思,用距离除以速度,然后排序,数组中第一个数就是第一枪要打的,第二个数字就是第二枪要打的,如果t[i] > i
则说明来不及打了,就直接return
5802. 统计好数字的数目
https://leetcode-cn.com/contest/weekly-contest-248/problems/count-good-numbers/
我写的代码,很好理解,但是超时了
class Solution {
public:
int countGoodNumbers(long long n) {
//偶数有0,2,4,6,8一共5个
//质数有2,3,5,7一共4个
long long res=1;
long long chu=1e9 + 7;
for(long long i=0;i<n/2;i++){
res=res*5*4%chu;
}
if(n%2) res=res*5%chu;
else res=res%chu;
return res;
}
};
大佬都用了快速幂算法
(发现我在做题的时候就用到了这个方法 但是还是超时了)
参考
https://blog.csdn.net/qq_19782019/article/details/85621386
class Solution {
public:
int countGoodNumbers(long long n) {
if(n&1) return bp(n/2,4)*bp((n+1)/2,5)%chu;
else return bp(n/2,4)*bp(n/2,5)%chu;
}
private:
long long chu=1e9+7;
long long bp(long long power,long long base){
long long result=1;
while(power>0){
if(power&1){
result=result*base%chu;
}
power>>=1;
base=base*base%chu;
}
return result;
}
};