网易2021校招笔试-C++开发工程师(提前批)

链接:

https://www.nowcoder.com/test/question/908255677b6f4c18a9074c12f21acd59?pid=28083344&tid=47458050

 

现在有n个物品,每一个物品都有一个价值,现在想将这些物品分给两个人,要求这两个人每一个人分到的物品的价值总和相同(个数可以不同,总价值相同即可),剩下的物品就需要扔掉,现在想知道最少需要扔多少价值的物品才能满足要求分给两个人。

输入描述:

第一行输入一个整数 T,代表有 T 组测试数据。
对于每一组测试数据,一行输入一个整数 n ,代表物品的个数。
接下来 n 个数,a[i] 代表每一个物品的价值。

1<= T <= 10
1 <= n <= 15
1 <= a[i] <= 100000 
输出描述:
对于每一组测试数据,输出一个答案代表最少需要扔的价值。

 输入例子1:

1
5
30 60 5 15 30

 解析:

假设从一堆数字S0中取两堆数字S1,S2(S0包含S1+S2),使得S1和S2的和val1和val2相等。只要找到最大的两个相同的子和(val1、val2)即可算出需要丢弃的最小和。分别假设第i个数字被放在左边、右边、哪边都不放写出递归表达式。

 

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int maxval = 0;

void dfs(int a, int b, int index, vector<int> nums){
    if(a==b){
        maxval = max(maxval, a);
    }
    if(index==nums.size())
        return;
    dfs(a+nums[index], b, index+1, nums);  // 放在左边
    dfs(a, b+nums[index], index+1, nums);  // 放在右边
    dfs(a, b, index+1, nums);  // 两边都不放
}

int main(){
    int n; // 测试数据数量
    cin>>n;
    for(int i =0; i < n; i++){
        maxval = 0;  // 每一次重新开始,所以要置为0
        int m;
        cin>>m; // m个物品
        vector <int> nums(m);
        for(int i = 0; i < m; i++){
            cin>>nums[i];
        }

        dfs(0,0,0,nums);
        int sum = 0;
        for(int i = 0; i <nums.size(); i++)
            sum += nums[i];
        cout<<sum-maxval*2<<endl;
    }
    return 0;
    
}

 

 

 

第二题:

小易得到了一个仅包含大小写英文字符的字符串,该字符串可能不是回文串。(“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串,“asds”就不是回文串。) 

小易可以在字符串尾部加入任意数量的任意字符,使其字符串变成回文串。 

现在请你编写一个程序,程序要能计算出小易可以得到的最短回文串。 


输入描述:
一行包括一个字符串。

输出描述:
一行包括一个字符串,代表答案。

 

输入例子2:
noo

 

输出例子2:
noon
#include<iostream>
using namespace std;
bool judge(string a, int i, int j){
    while(i<j){
        if(a[i]!=a[j])
            return false;
        i++;
        j--;
    }
    return true;
}
int main(){
    string str;
    cin>>str;
    int len = str.size();
    int i;
    for(i = 0; i < str.size(); i++){
        if(judge(str, i, len-1)){  //判断i到末尾是不是回文串
            cout<<str;
            break;
        }
        str.insert(str.begin()+len, str[i]);  // 如果不是,将当前str[i]插入到字符串的末尾。
    }
    return 0;
}

 

第三题:

现在有n个人排队买票,已知是早上8点开始卖票,这n个人买票有两种方式:

第一种是每一个人都可以单独去买自己的票,第 i 个人花费 a[i] 秒。

第二种是每一个人都可以选择和自己后面的人一起买票,第 i 个人和第 i+1 个人一共花费 b[i] 秒。

最后一个人只能和前面的人一起买票或单独买票。

由于卖票的地方想早些关门,所以他想知道他最早几点可以关门,请输出一个时间格式形如:08:00:40 am/pm

时间的数字要保持 2 位,若是上午结束,是 am ,下午结束是 pm

输入描述:
第一行输入一个整数 T,接下来有 T 组测试数据。

对于每一组测试数据:输入一个数 n,代表有 n 个人买票。

接下来n个数,代表每一个人单独买票的时间 a[i]。

接下来 n-1 个数,代表每一个人和他前面那个人一起买票需要的时间 b[i]
1<= T <=100
1<= n <=2000
1<= a[i] <=50
1<= b[i] <=50
输出描述:
对于每组数据,输出一个时间,代表关门的时间 。

 

输入例子1:
2
2
20 25
40
1
8
输出例子1:
08:00:40 am
08:00:08 am
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>  // setw 与setfill所在的头文件
using namespace std;
/*
动态规划
dp[i] 表示前i个人买票需要的最短时间,第i的人买票有两种情况
1. 第i个人单独买
dp[i] = dp[i-1] + 第i个人单独买票需要的时间
2. 第i个人和前面一个人一起买
dp[i] = dp[i-2] +  第i个人和他前面那个人一起买票需要的时间
两则取最小值
*/
int main(){
    int n;
    cin>>n;  //测试数据组数
    while(n--){
        int m; // 人数
        cin>>m;
        vector<int> dp(m+1,0);  // dp[i]  i个人买票耗费的最短时间
        vector<int> one(m);  // 单人去买票耗费的时间
        for(int i = 0; i < m; i++)
            cin>>one[i];
        dp[1] = one[0];
        int two;
        for(int i = 2; i <=m; i++){
            cin>>two;
            dp[i] = min(dp[i-1]+one[i-1],dp[i-2]+two);
        }
        int sec = dp[m]%60;
        int min = (dp[m]/60)%60;
        int hou = (dp[m]/3600)+8;
        //08:00:40 am 
        // cout<<setfill('*')<<setw(5)<<'a'<<endl; 输出  ****a 意思就是宽度为5,前面填充0
        if(hou>12){
            cout<<setfill('0')<<setw(2)<<hou-12<<":";
            cout<<setfill('0')<<setw(2)<<min<<":";
            cout<<setfill('0')<<setw(2)<<sec<<" pm"<<endl;
        }else{
            cout<<setfill('0')<<setw(2)<<hou<<":";
            cout<<setfill('0')<<setw(2)<<min<<":";
            cout<<setfill('0')<<setw(2)<<sec<<" am"<<endl;
        }
    }
}

 

第四题:

 

posted @ 2021-09-05 21:40  三一一一317  阅读(139)  评论(0)    收藏  举报