3.12 小米笔试(均AC)
那山就在那里
很显然贪心,从间距最大的地方往返一次,直到可以在山上待够k天
#include<bits/stdc++.h> using namespace std; signed main(){ int n,k; cin>>n>>k; vector<int>a(n); priority_queue<int>q; int t=0; for(int i=0;i<n;i++){ cin>>a[i]; if(t) q.push(a[i]-t-1); t=a[i]; } int ans=2; t=a[n-1]-a[0]+1; while(q.size()&&t>k){ ans+=2; t-=q.top(); q.pop(); } cout<<ans<<endl; }
小李买汽车
看到题目很容易想到背包。数据范围200*200*200,显然可以背包做
#include<bits/stdc++.h> using namespace std; int main(){ int x,y,n; cin>>x>>y>>n; vector<vector<int>>car; for(int i=0;i<n;i++){ int v,xx,yy,k; cin>>v>>xx>>yy>>k; car.push_back({v,xx,yy}); for(int j=0;j<k;j++){ int tv,tx,ty; cin>>tv>>tx>>ty; car.push_back({tv+v,xx+tx,yy+ty}); } } vector<vector<int>>dp(x+1,vector<int>(y+1,INT_MAX/2)); dp[0][0]=0; for(int i=0;i<car.size();i++){ for(int j=0;j<=x;j++){ for(int k=0;k<=y;k++){ if(j-car[i][1]<0&&k-car[i][2]<0){ dp[j][k]=min(dp[j][k],dp[0][0]+car[i][0]); }else if(j-car[i][1]<0){ dp[j][k]=min(dp[j][k],dp[0][k-car[i][2]]+car[i][0]); }else if(k-car[i][2]<0){ dp[j][k]=min(dp[j][k],dp[j-car[i][1]][0]+car[i][0]); } else dp[j][k]=min(dp[j][k],dp[j-car[i][1]][k-car[i][2]]+car[i][0]); } } } cout<<dp[x][y]<<endl; return 0; }