Rank
国庆节补课,赛后补题,这周题比较简单.
A. 文件夹操作日志搜集器
简单模拟.
class Solution {
public:
int minOperations(vector<string>& logs) {
int n=logs.size();
int ans=0;
for(string log:logs){
if(log=="./") continue;
if(log=="../"){
if(ans) --ans;
}
else{
++ans;
}
}
return ans;
}
};
B. 经营摩天轮的最大利润
简单模拟.
class Solution {
public:
int minOperationsMaxProfit(vector<int>& customers, int boardingCost, int runningCost) {
int n=customers.size();
int ans=-1,id=0,cnt=0,i=0,cur=0,sum=0;
while(i<n || cur>0){
if(i<n) cur+=customers[i];//加上新来的人
++cnt;//轮数加1
if(cur>=4){
sum+=4*boardingCost-runningCost;
cur-=4;
}
else{
sum+=cur*boardingCost-runningCost;
cur=0;
}
if(sum>ans){
ans=sum;
id=cnt;
}
++i;//进入下一时刻
}
if(ans<0) return -1;
return id;
}
};
C. 皇位继承顺序
将名字字符串映射成图结点编号,按照出生关系建立一颗树,继承序列就是这个树的前序遍历序列.
class ThroneInheritance {
public:
const static int maxn=1e5+50;
int tot=0;
unordered_map<string,int> getid;
vector<string> getname;
vector<int> g[maxn];
bool dead[maxn];
ThroneInheritance(string kingName) {
getname.emplace_back("");
getid[kingName]=++tot;
dead[tot]=false;
getname.emplace_back(kingName);
}
void birth(string parentName, string childName) {
int u=getid[parentName];
getid[childName]=++tot;
int v=getid[childName];
dead[v]=false;
getname.push_back(childName);
g[u].emplace_back(v);
}
void death(string name) {
int u=getid[name];
dead[u]=true;
}
void dfs(int u,vector<string>& res){
if(!dead[u]) res.emplace_back(getname[u]);
for(int v:g[u]) dfs(v,res);
}
vector<string> getInheritanceOrder() {
vector<string> res;
dfs(1,res);
return res;
}
};
D. 最多可达成的换楼请求数目
二进制暴力枚举每个要求满足或不满足,对于每种枚举结果判断一下是否满足要求(每个点的入度和出度相等),如果满足则更新答案的最大值.
class Solution {
public:
int maximumRequests(int n, vector<vector<int>>& requests) {
int d[25]={0};
int m=requests.size();
int ans=0;
for(int s=0;s<(1<<m);++s){
for(int i=0;i<n;++i) d[i]=0;
int cnt=0;
for(int i=0;i<m;++i){
if(s>>i&1){
++cnt;
++d[requests[i][0]];
--d[requests[i][1]];
}
}
bool ok=true;
for(int i=0;i<n;++i){
if(d[i]!=0){
ok=false;
break;
}
}
if(ok && cnt>ans) ans=cnt;
}
return ans;
}
};