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