牛客网
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客网相关的知识,希望对你有一定的参考价值。
百度2017春招笔试真题编程题集合
1.买帽子
思路:直接排序数出第三个即可
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <algorithm> 5 6 using namespace std; 7 8 int main() 9 { 10 int n; 11 int count = 1; 12 13 cin >> n; 14 vector<int> nums(n); 15 16 for (int i = 0; i < n; i++) 17 cin >> nums[i]; 18 sort(nums.begin(), nums.end()); 19 20 for (int i = 1; i < n; i++) 21 { 22 if (nums[i] != nums[i - 1]) 23 { 24 count++; 25 if (count == 3) 26 { 27 cout << nums[i] << endl; 28 break; 29 } 30 } 31 } 32 if (count < 3) 33 cout << -1 << endl; 34 35 return 0; 36 }
2.度度熊回家
思路:直接扫,先算出每个点经过的距离和,然后再减去除去每个点的情况判断
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <algorithm> 5 6 using namespace std; 7 8 int main() 9 { 10 int n; 11 int sum = 0; 12 int res = 99999999; 13 int num; 14 15 cin >> n; 16 vector<int> nums(n); 17 18 for (int i = 0; i < n; i++) 19 cin >> nums[i]; 20 21 for (int i = 1; i < n; i++) 22 sum += abs(nums[i] - nums[i - 1]); 23 for (int i = 1; i < n - 1; i++) 24 { 25 num = sum - abs(nums[i] - nums[i - 1]) - abs(nums[i + 1] - nums[i]) + abs(nums[i + 1] - nums[i - 1]); 26 res = min(res, num); 27 } 28 29 cout << res << endl; 30 31 return 0; 32 }
3.寻找三角形
思路:海伦公式:
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cmath> 5 #include <algorithm> 6 7 using namespace std; 8 9 struct point 10 { 11 char ch; 12 int x, y, z; 13 }; 14 15 double dis(point a, point b) 16 { 17 return sqrt(1.0 * (b.x - a.x) * (b.x - a.x) + 1.0 * (b.y - a.y) * (b.y - a.y) + 1.0 * (b.z - a.z) * (b.z - a.z)); 18 } 19 20 int main() 21 { 22 int n; 23 double s; 24 double res = 0.0; 25 26 cin >> n; 27 vector<point> nums(n); 28 29 for (int i = 0; i < n; i++) 30 cin >> nums[i].ch >> nums[i].x >> nums[i].y >> nums[i].z; 31 32 for (int i = 0; i < n; i++) 33 { 34 for (int j = 0; j < n; j++) 35 { 36 if (i == j) 37 continue; 38 39 for (int k = 0; k < n; k++) 40 { 41 if (k == j || k == i) 42 continue; 43 44 if ((nums[i].ch == nums[j].ch && nums[j].ch == nums[k].ch) || (nums[i].ch != nums[j].ch && nums[j].ch != nums[k].ch && nums[i].ch != nums[k].ch)) 45 { 46 double dx = dis(nums[i], nums[j]); 47 double dy = dis(nums[i], nums[k]); 48 double dz = dis(nums[j], nums[k]); 49 double p = (dx + dy + dz) / 2; 50 s = sqrt(p * (p - dx) * (p - dy) * (p - dz)); 51 res = max(res, s); 52 } 53 } 54 } 55 } 56 57 printf("%.5lf\n", res); 58 59 return 0; 60 }
4.有趣的排序
思路:按排序之后数前边对应的位置有多少,然后n减就是改变的次数
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 5 using namespace std; 6 7 int main() 8 { 9 int n; 10 11 cin >> n; 12 vector<int> nums(n); 13 vector<int> num(n); 14 15 for (int i = 0; i < n; i++) 16 { 17 cin >> nums[i]; 18 num[i] = nums[i]; 19 } 20 21 sort(num.begin(), num.end()); 22 int count = 0; 23 for (int i = 0; i < n; i++) 24 { 25 if (nums[i] == num[count]) 26 count++; 27 } 28 cout << n - count << endl; 29 30 return 0; 31 }
5.不等式数列
思路:此动态规划思想来源于网上:
dp[i][j]表示有i个数字及j个小于号所能组成的数量(大于号数量当然是i - j - 1次,后面需要使用)
而加入第i + 1个数字时,分以下四种情况:
1.如果将i+1插入当前序列的开头,即有了1<2,加入后成为3>1<2,会发现等于同时加入了一个大于号!(此时可以无视1与2之间的关系,因为i+1>i)
2.如果将i+1插入当前序列末尾,即1<2变成了 1<2<3,会发现等于同时加入了一个小于号! (此时可以无视1与2之间的关系,因为i+1>i)
3.如果将i+1加入一个小于号之间,即已经有 1<2了,向中间加入3,会发现变成了1<3>2,等于同时加入了一个大于号!
4.如果将i+1加入一个大于号中间,即有了2>1,变成了2<3>1,等于同时加入了一个小于号!
综上所述,dp[i][j]等于以上四种情况之和:
dp[i - 1][j] //将i加在开头等于加入一个大于号,即要求i-1个数时已经有了j个小于号
dp[i - 1][j - 1] //将i加在末尾等于加入一个小于号,即要求i-1个数时已经有了j-1个小于号
dp[i - 1][j] * j //将i加在任意一个小于号之间,等于加入了一个大于号;即要求i-1个数时已经有了j个小于号,每个小于 号都可以进行这样的一次插入
dp[i - 1][j - 1] * (i- j - 1) //将i加载任意一个大于号之间,等于加入了一个小于号;即要求i-1个数时有了j-1个小于号,而此时共有
(i - 1) - (j - 1)- 1个大于号,每个大于号都要进行一次这样的操作
合并同类项即为:
dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i - 1][j] * (j + 1))
参考:http://blog.csdn.net/sb_ihateyou/article/details/71123479
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int dp[1005][1005]; 7 8 int main() 9 { 10 int n, k; 11 12 cin >> n >> k; 13 14 for(int i = 1; i <= n; i++) 15 { 16 for(int j = 0; j < n; j++) 17 { 18 if(j == 0) 19 dp[i][j] = 1; 20 else 21 dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i-1][j] * (j + 1)) % 2017; 22 } 23 } 24 cout << dp[n][k] << endl; 25 26 return 0; 27 }
以上是关于牛客网的主要内容,如果未能解决你的问题,请参考以下文章