1. 一辆汽车加满油后可行驶n公里,假设汽车在起点是加满油的。
旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,
使到达终点的沿途加油次数最少。
对于给定的n和k个加油站位置,编程输出停靠加油站的位置。
例如:
n = 100
k = 5
d = [50,80,39,60,40,32] (表示加油站之间的距离)
bool count(){
vector<int>station;
for(int i=0;i<k+2;++i){
if(i==k&&n-d[i]>=0){
return 1;
}else if(i==k&&n-d[i]<0){
return -1;
}
if(n-d[i]>0&&n-d[i+1]>=0){
n=n-d[i];
}else if(n-d[i]>0&&n-d[i+1]<0){
station.push_back(i);
n=100;
}else if(n-d[i]<0){
return -1;
}
}
}
2. 某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封共有多少种不同情况?
最蠢的方法就是找出所有可能排列,然后去掉有信封放对位置的排列;其实此问题就是错排问题。
//2.1
void quanpailie(vector<int>array,int left,int right,vector<int>&temp,vector<vector<int> >&res){
if(left==right){
res.push_back(temp);
}else{
for(int i=left;i<=right;++i){
swap(array,i,left);
temp.push_back(array[i]);
quanpailie(array,left+1,right,temp,res);
swap(array,i,left);
}
}
}
vector<vector<int> >res;
vector<int>temp;
quanpailie(array,0,array.size()-1,temp,res);
int ct=0;
for(int i=0;i<res.size();++i){
int flag=1;
for(int j=0;j<res[i].size();++j){
if(res[i][j]==j){
flag=0;
break;
}
}
if(flag)
ct++;
}
//2.2
d[i]=(n-1)(dp[i-1]+dp[i-2])
int count(int n){
vector<int>dp(n+1,0);
dp[1]=0;
dp[2]=1;
for(int i=3;i<=n;++i){
dp[i]=(i-1)(dp[i-1]+dp[i-2]);
}
return dp[n];
}
ali2019
最新推荐文章于 2021-11-26 14:41:56 发布