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