网易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;
}
}
}
第四题:

浙公网安备 33010602011771号