2023-03-05力扣每日一题
链接:
https://leetcode.cn/problems/triples-with-bitwise-and-equal-to-zero/
题意:
模拟一个摩天轮,四个舱,每个舱最多四人,给一个数组,表示摩天轮每切换一次座舱会来多少人排队(人不会走)。每进一个人会得到runningCost
元,每切换一次座舱花费boardingCost
元。当切换到这个座舱时,如果里面有人会都下来(即上一轮进这个舱的人再到这个舱的时候就都出去了,舱空了)。
求进行几次切换赚的钱最多(即使有人没下来也没关系),如果没有利润为正方案,返回-1
解:
嗯模拟就好了,判断是否有人等待,计算赚到的钱-花费剩下的利润take
int take=up*boardingCost-(i+1)*runningCost;
(up是上去的人数,累积一下)
第一次没删除检验数据用的cout直接超时了,又写了个第二版,给自己蠢晕
实际代码:
int wait=0,ans=0,turn=0,up=0;int lg=customers.size();for(int i=0;i<lg||wait>0;i++){int add=0;if(i<lg){add=min(wait+customers[i],4);wait+=(customers[i]-add);}else{add=min(wait,4);wait-=(add);}//cout<<add<<endl;up+=add;int take=up*boardingCost-(i+1)*runningCost;//cout<<up<<" "<<wait<<endl;就是这个没注释if(take>ans){ans=take;turn=i+1;}}return ans==0?-1:turn;
第二版,循环只遍历完了数组,剩下还在排队的人算两个结果
1.只上满舱(四个人四个人上)花费为t1
2.上完所有满仓,再上剩下的人(不满四个),花费为t2
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int solve(vector<int>& customers, int boardingCost, int runningCost)
{int wait=0,ans=0,turn=0,up=0,take;int lg=customers.size();for(int i=0;i<lg;i++){int add=0;add=min(wait+customers[i],4);wait+=(customers[i]-add);//cout<<add<<endl;up+=add;take=up*boardingCost-(i+1)*runningCost;//cout<<up<<" "<<wait<<endl;if(take>ans){ans=take;turn=i+1;}}//cout<<take<<endl;int t1=(wait/4*4)*boardingCost-(wait/4)*runningCost;//cout<<t1<<endl;if(take+t1>ans){ans=take+t1;turn=lg+(wait/4);}if(wait%4!=0){int t2=t1+wait%4*boardingCost-runningCost;//cout<<t2<<endl;if(take+t2>ans){ans=take+t2;turn=lg+(wait/4+1);}}return ans==0?-1:turn;
}
int main()
{vector<int> customers;int boardingCost,runningCost;int n;cin>>n;for(int f=1;f<=n;f++){int temp;cin>>temp;customers.push_back(temp);}cin>>boardingCost>>runningCost;int ans=solve(customers,boardingCost,runningCost);cout<<ans<<endl;
}
限制:
n == customers.length
1 <= n <= 105
0 <= customers[i] <= 50
1 <= boardingCost, runningCost <= 100