链家、CVTE笔试题

来源:互联网 发布:php namespace use 编辑:程序博客网 时间:2024/04/30 12:43

同一个老师,同一片代码。昨天,同学在做链家和CVTE的笔试题,我也拿来做了做(别问我为什么没有笔试通知,问了也不说),结果发现一个小伙伴和我做的代码的流程简直一模一样,甚至变量都定义的差不多,真的是同一个老师,同一片代码。。。

看题:

一、小明有N个食物,食物有各自的价值,小明想卖掉他们来换钱,时间越久,价值越高,第一天价值为1,第二天为2......,求最大价值?
例如:5 1 3 1 5 2   ->   43
int Much(vector<int> &ve,int num)
{
int left = 0;
int right = num-1;
int max = 0;
int i = 1;
while(left <= right)
{
if(ve[left] < ve[right])
max += ve[left++]*i;
else if(ve[left] > ve[right])
max += ve[right--]*i;
else
{
int left_tmp = left;
int right_tmp = right;
int tmp_i = 0;
while(left_tmp < right_tmp && ve[left_tmp] == ve[right_tmp])
{
if(tmp_i & 1)
left_tmp++;
else
right_tmp--;
}
if(left_tmp == right_tmp)
max += ve[right--] * i;
else
{
if(ve[left_tmp] < ve[right_tmp])
max += ve[left++] * i;
else
max += ve[right--] * i;
}
}
i++;
}
return max;
}
void main()
{
vector<int> ve;
int num;
cin>>num;
int tmp;
for(int i = 0; i < num; ++i)
{
cin>>tmp;
ve.push_back(tmp);
}
cout<<Much(ve,num)<<endl;
}

这道题很像贪心算法,不过昨天的通过率只有27%。后来想了想,改了一下,就是上边那样,但是没有那个编译器了,不知道现在通过率多少。

二、最大的连续子数组的长度
#include <iostream>
#include <vector>
using namespace std;


int getMaxSize(int *ar,int length)
{
if(ar == NULL || length <= 0)
return 0;
int max = 0;
int tmp1 = 0;
int tmp2 = 0;
for(int i = 0; i < length; ++i)
{
if(i == 0)
continue;
if(ar[i] - ar[i-1] == 1)
tmp1++;
else
tmp1 = 0;
if(ar[i] - ar[i-1] == -1)
tmp2++;
else
tmp2 = 0;
if(tmp1 > max)
max = tmp1;
if(tmp2 > max)
max = tmp2;
}
return max+1;
}
void main()
{
int ar[] = {1,2,3,4,7,6,5,4,3,2,1,7};
int len = sizeof(ar)/sizeof(ar[0]);
cout<<getMaxSize(ar,len)<<endl;
}

三、删除字符串中具体的字符

这道题我面58的时候,面试官让我写过,除了处理边界之外,没什么难度。

#include <iostream>
#include <string>
using namespace std;


char *getResult(char *src,int length,char c)
{
int num = 0;
for(int i = 0; i < length; ++i)
{
if(src[i] == c)
num++;
else
src[i-num] = src[i];
}
src[length-num] = 0;
return src;
}
int main()
{
char str[1000] = {0};
cin>>str;
char ch;
cin>>ch;
printf("%s\n",getResult(str,strlen(str),ch));
return 0;
}

四、逃亡问题,两个人要逃亡,只有一个包,现在给出物品的数量,体积,价值的数值,求最大的组合方式?

典型的0-1背包问题,很遗憾,昨天没写出来。。。现在也还不会,不过代码已经有了,先看看。

#include<iostream>
#include<cstring>
using namespace std;
class item
{
public:
int num;
int volume;
int value;
};
item  record[2205][20]; 
int dp[1000];  
int main()
{
    int item_species,volume,i,j,k;
while(cin>>item_species>>volume)
{
        memset(dp,0,sizeof(dp));
memset(record,0,sizeof(record));
item item1;
for(i=0;i<item_species;i++)
{
    cin>>item1.num>>item1.volume>>item1.value;
item1.num-=1;
record[i][0].num=1, record[i][0].volume=item1.volume, record[i][0].value=item1.value;
for(j=1;item1.num>0;j++)
{
item1.num-=record[i][j-1].num*2;
if(item1.num<0) 
{
 int num=item1.num+record[i][j-1].num*2;
 record[i][j].num=num;
                      record[i][j].volume=record[i][0].volume*num;
 record[i][j].value=record[i][0].value*num;
}
else
{
record[i][j].num=record[i][j-1].num*2;
record[i][j].volume=record[i][j-1].volume*2;
record[i][j].value=record[i][j-1].value*2;
}
}
for(k=0;k<j;k++)
for(int x=volume;x-record[i][k].volume>=0;x--)
if(dp[x] < dp[x-record[i][k].volume]+record[i][k].value)
     dp[x]=dp[x-record[i][k].volume]+record[i][k].value;
 
}
cout<<dp[volume]<<endl;
}
return 0;
}