滴滴4.10机试编程题小结

第一题贪心算法过了30%
题目大体:同一时刻给定一些进程准备时间,运行时间,进程只有在准备好后才能运行,求运行完所有进程所需的最短时间?
贪心策略:越早结束的进程先运行,结束时间相同的进程优先执行运行时间长的进程。
过了30%说明想法不完善
以下是代码:
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<unordered_map>
using namespace std;

bool cmp(int a,int b){return a>b;}
int main(){
    int n=0;
    cin>>n;
    vector<int> nums(n,0);
    multimap<int,int> map1;
    int i=0;
    int finish=0;

    for(int i=0;i<n;i++){
        int a=0,b=0;
        cin>>a>>b;
        map1.insert(pair<int,int>(a+b,b));
    }

    auto iter=map1.begin();
    int prev=iter->first;
    while(iter!=map1.end()){
       vector<int> temp;
       while(iter->first==prev){
           temp.push_back(iter->second);iter++;
       }
        sort(temp.begin(),temp.end(),cmp);
        finish=prev>finish?prev:finish;
        for(int i=1;i<temp.size();i++){
            finish+=temp[i];
        }
        prev=iter->first;
    }
    cout<<finish<<endl;
    
    return 0;
    
}


第二题动态规划过了91%
实质上就是求最长的等差数列长度,要注意对于i位置的a[i]有a[i]>x*i,因为题中说只能改成正数,所以a[i]至少能够保证以a[i]为结尾的等差数列第一个数是正数。
dp[i]:以i为结尾的最大等差数列长度
dp[i]=if(nums[i]-nums[j]==x*(i-j)&&a[i]>i*x){max(dp[j]+1);}
剩下的9%时间超了。。。

#include<iostream>
#include<vector>
using namespace std;
int main(){
    int n=0,x=0;
    cin>>n>>x;
    vector<int> nums(n,0);
    for(int i=0;i<n;i++){
        cin>>nums[i];
    }
    vector<int> dp(n,0);
    dp[0]=1;
    for(int i=1;i<n;i++){
        dp[i]=1;
        int max1=1;
        for(int j=0;j<i;j++){
            if(nums[i]-nums[j]==x*(i-j)&&(nums[i]-x*i)>0){
                max1=max1>(dp[j]+1)?max1:(dp[j]+1);
            }
        }
        dp[i]=max1>dp[i]?max1:dp[i];
    }
    int length=0;
    for(int i=0;i<n;i++){
        length=length>dp[i]?length:dp[i];
    }
    cout<<n-length<<endl;
    return 0;
}


#滴滴##笔试题目#
全部评论
滴滴笔试多少能过
点赞
送花
回复
分享
发布于 2021-04-11 00:24

相关推荐

1 3 评论
分享
牛客网
牛客企业服务