牛客网

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 }
View Code:

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 }
View Code:

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 }
View Code:

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 }
View Code:

 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 }
View Code:

 














以上是关于牛客网的主要内容,如果未能解决你的问题,请参考以下文章

牛客网-统计字符

牛客网在线编程:身份证分组

牛客网——Java刷题篇

牛客网怎么看同校的贴

Python牛客网刷题-Day1

华为od机考牛客网是骗人的吗