美团第二次笔试,记录
第一题,栈模拟
void first(){
int t;
cin>>t;
while(t>0){
int n;
cin>>n;
vector<int> nums(n);
vector<int> target(n);
for(int i=0;i<n;i++){
cin>>nums[i];
}
stack<int> sta;
sta.push(nums[0]);
for(int i=0;i<n;i++){
cin>>target[i];
}
int temp=1;
for(int i=0;i<n;i++){
if(sta.empty()&&temp<n){
sta.push(nums[temp++]);
}
while(target[i]!=sta.top() && temp<n){
sta.push(nums[temp++]);
}
if(temp==n && sta.top()!=target[i]){
cout<<"No"<<endl;
break;
}
else{
sta.pop();
}
}
if(sta.empty()){
cout<<"Yes"<<endl;
}
t--;
}
}
第二题 简单dp;
void second(){
int n;
cin>>n;
vector<int> nums(n);
for(int i=0;i<n;i++){
cin>>nums[i];
}
vector<int> dp(n,0);
if(n==1){ cout<<nums[0]<<endl;return;}
if(n==2){ cout<<max(nums[0],nums[1])<<endl;return;}
if(n==3){ cout<<max(nums[0],max(nums[1],nums[2]))<<endl;return;}
dp[0]=nums[0];
dp[1]=max(nums[1],dp[0]);
dp[2]=max(dp[1],nums[2]);
for(int i=3;i<n;i++){
dp[i]=max(dp[i-3]+nums[i],dp[i-1]);
}
cout<<dp[n-1]<<endl;
}
第三题
前面直接写,82%,加上前缀和,没变化,加上二分查找,才过,二分查找很重要
void third(){
int n,m;
cin>>n>>m;
vector<int> nums(n);
for(int i=0;i<n;i++){
cin>>nums[i];
}
vector<long> bags(m);
for(int i=0;i<m;i++){
cin>>bags[i];
}
//sort(nums.begin(),nums.end());
vector<long> prefix(n);
prefix[0]=nums[0]*nums[0];
for(int i=1;i<n;i++){
prefix[i]=prefix[i-1]+nums[i]*nums[i];
}
int flag=0;
for(int i=0;i<m;i++){
long bag=bags[i];
int left =0,right=n-1;
bool ttt=false;
while(left<right){
int mid = left+(right-left)/2;
if(prefix[mid]==bag){
flag=mid;
ttt=true;
break;
}
else if(prefix[mid]>bag){
right=mid-1;
}
else{
left=mid+1;
}
}
if(!ttt){
if(bag>=prefix[left]){
flag=left;
}
else if(bag>=prefix[right]){
flag=right;
}
else{
flag=right-1;
}
}
cout<<flag+1;
if(i<m-1){
cout<<" ";
}
}
}
第四题
用map模拟
void four(){
string str;
cin>>str;
int n;
cin>>n;
vector<string> query(n);
for(int i=0;i<n;i++){
cin>>query[i];
}
string temp="";
string key="";
unordered_map<string,string> map;
int len = str.size();
for(int i=0;i<len;i++){
if(str[i]=='='){
key=temp;
temp="";
}
else if(str[i]==';'){
map[key]=temp;
temp="";
}
else{
temp+=str[i];
}
}
for(int i=0;i<n;i++){
if(map.find(query[i])==map.end()){
cout<<"EMPTY"<<endl;
}
else{
cout<<map[query[i]]<<endl;
}
}
}
第五题 压轴的动态规划,又有破坏次数,还要买和不买
void fifth(){
int n,k;
cin>>n>>k;
vector<int> nums(n);
for(int i=0;i<n;i++){
cin>>nums[i];
}
vector<vector<vector<int>>> dp(n,vector<vector<int>>(k+1,vector<int>(2,0)));
dp[0][0][1]=nums[0];
for(int i=1;i<n;i++){
dp[i][0][0]=max(dp[i-1][0][0],dp[i-1][0][1]);
dp[i][0][1]=dp[i-1][0][0]+nums[i];
for(int j=1;j<=k;j++){
dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]);
dp[i][j][1]=max(dp[i-1][j-1][1],dp[i-1][j][0])+nums[i];
}
}
cout<<max(dp[n-1][k][0],dp[n-1][k][1])<<endl;
}
#笔试复盘#
字节跳动公司福利 1294人发布