题目链接:小红的口罩 (nowcoder.com)
学会暴力中如何降低复杂度
1.在每次循环中都会对 nums
进行排序操作,这样会增加时间复杂度 (超过1000ms)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>nums;
int main()
{
int n,k,sum=0,num;
cin>>n>>k;
for(int i=0; i<n; i++)
{
cin>>num;
nums.push_back(num);
}
sort(nums.begin(),nums.end());
int sign=0;
sum=nums[0];
while(k-sum>0)
{
sign++;
nums[0]=nums[0]*2;
sort(nums.begin(),nums.end());
sum+=nums[0];
}
cout<<sign<<endl;
return 0;
}
2.通过直接在循环内部找到最大值并进行操作,省去了排序的过程,使得代码更加高效。(60ms)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>nums;
int main()
{
int n,k,sum=0,num;
cin>>n>>k;
for(int i=0; i<n; i++)
{
cin>>num;
nums.push_back(num);
}
int sign=0;
while(sum<=k)
{
sort(nums.begin(),nums.end());
for(int i=0;i<n;i++)
{
if(nums[i]>nums[0])
{
break;
}
sum+=nums[i];
nums[i]*=2;
if(sum>k)
{
break;
}
sign++;
}
}
cout<<sign<<endl;
return 0;
}
总结,学会用if等判断语句代替掉排序,降低复杂度