第二题:5855. 找出数组中的第 K 大整数
C++这样写sort自定义排序怎么写编译多过不了,而且还一直发现不了自己的问题
class Solution {
public:
bool cmp(string a,string b){
int n1=a.size(),n2=b.size();
if(n1!=n2) return n1<n2;
else return a<b;
}
string kthLargestNumber(vector<string>& nums, int k) {
sort(nums.begin(),nums.end(),cmp);
int n=nums.size();
return nums[n-k];
}
};
原来是cmp函数不能写在类的里面,晕了!cmp写到正确位置
bool cmp(string a,string b){
int n1=a.size(),n2=b.size();
if(n1!=n2) return n1<n2;
else return a<b;
}
class Solution {
public:
string kthLargestNumber(vector<string>& nums, int k) {
sort(nums.begin(),nums.end(),cmp);
int n=nums.size();
return nums[n-k];
}
};
还可以用匿名函数,当时是在没办法用的这个方法过的
class Solution {
public:
string kthLargestNumber(vector<string>& nums, int k) {
auto my=[&](string a,string b){
int n1=a.size(),n2=b.size();
if(n1!=n2) return n1<n2;
else return a<b;
};
sort(nums.begin(),nums.end(),my);
int n=nums.size();
return nums[n-k];
}
};
第三题:5856. 完成任务的最少工作时间段
一直都在想dp状压,但是就是样例都过不了,叫一个气呀,原来是自己二进制操作运算的优先级都没搞清楚,晕了!原因如下:
-
本应该:int l=(1<<n)-1;
却写成了:int l=1<<n-1;
这样会先计算n-1,再进行左移操作,晕
- 本应该:if((i&(1<<j))==0)
却写成了:if(i&1<<j==0)或者if(i&(1<<j)==0)
这样会将(1<<j)==0表达式先运算
正确代码:
class Solution {
public:
struct node{
int t=17,left=0;
bool operator <(node a)const{
if(t==a.t) return left>a.left;
else return t<a.t;
}
};
int minSessions(vector<int>& tasks, int sessionTime) {
int n=tasks.size();
vector<node> dp(1<<n);
dp[0].t=0;
dp[0].left=sessionTime;
int l=(1<<n)-1;
for(int i=0;i<l;i++)
for(int j=0;j<n;j++){
if((i&(1<<j))==0){
int cur=i|(1<<j);
node k;
if(dp[i].left>tasks[j]){
k.t=dp[i].t;
k.left=dp[i].left-tasks[j];
}else if(dp[i].left==tasks[j]){
k.t=dp[i].t+1;
k.left=sessionTime;
}
else
{
k.t=dp[i].t+1;
k.left=sessionTime-tasks[j];
if(k.left==0){
k.t++;
k.left=sessionTime;
}
}
dp[cur]=min(dp[cur],k);
//printf("i:%d,j:%d,cur:%d,dp:%d,%d\n",i,j,cur,dp[cur].t,dp[cur].left);
}
}
if(dp[l].left!=sessionTime) return dp[l].t+1;
else return dp[l].t;
}
};