滴滴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; }