牛客网

百度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:

 

2017年校招全国统一模拟笔试(第三场)编程题集合

1.变换次数

思路:直接每次乘起来判断即可

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     long long num, s;
 8     int count = 0;
 9     
10     cin >> num;
11     while (num >= 10)
12     {
13         s = 1;
14         while (num)
15         {
16             s *= num % 10;
17             num /= 10;
18         }
19         num = s;
20         count ++;
21     }
22     cout << count << endl;
23     
24     return 0;
25 }
View Code:

 2.神奇数

思路:开个hash存每位数字出现的个数,然后判断两位质数即可

 1 #include <iostream>
 2 #include <unordered_map>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int a, b;
 9     int sum = 0;
10     
11     cin >> a >> b;
12     for (int i = max(a, 10); i <= b; i++)
13     {
14         unordered_map<int, int> s;
15         int num = i;
16         while (num)
17         {
18             s[num % 10]++;
19             num /= 10;
20         }
21         if ((s.count(1) && s[1] >= 2) || (s.count(1) && s.count(3)) || (s.count(1) && s.count(7)) || (s.count(1) && s.count(9)) || (s.count(2) && s.count(3)) || (s.count(2) && s.count(9)) || (s.count(1) && s.count(4)) || (s.count(7) && s.count(3)) || (s.count(4) && s.count(3)) || (s.count(4) && s.count(7)) || (s.count(5) && s.count(3)) || (s.count(1) && s.count(6)) || (s.count(5) && s.count(9)) || (s.count(6) && s.count(7)) || (s.count(7) && s.count(9)) || (s.count(8) && s.count(3)) || (s.count(8) && s.count(9)))
22             sum++;
23     }
24     cout << sum << endl;
25     
26     return 0;
27 }
View Code:

3.添加字符

思路:每次对a在b里扫一遍得出不相同的最小值就是结果

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int res = 99999999;
10     string a, b;
11     
12     cin >> a >> b;
13     int m = a.size();
14     int n = b.size();
15     
16     for (int i = 0; i <= n - m; i++)
17     {
18         int count = 0;
19         for (int j = 0; j < m; j++)
20         {
21             if (a[j] != b[i + j])
22                 count++;
23         }
24         res = min(res, count);
25     }
26     cout << res << endl;
27     
28     return 0;
29 }
View Code:

4.数组变换

思路:乘以2即就相当于除以2,把数组的每个偶数一直除以2直到奇数,然后检查是否全部相等

 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     for (int i = 0; i < n; i++)
14         cin >> nums[i];
15     
16     for (int i = 0; i < n; i++)
17     {
18         while ((nums[i] & 1) == 0)
19             nums[i] /= 2;
20     }
21     int i = 1;
22     for (; i < n; i++)
23     {
24         if (nums[i] != nums[i - 1])
25             break;
26     }
27     
28     if (i == n)
29         cout << "YES" << endl;
30        else
31         cout << "NO" << endl;
32     
33     return 0;
34 }
View Code:

5.组队竞赛

思路:先排序,然后依照最大次大组成一队取次大值取n次即可

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int n;
10     long long sum = 0;
11     
12     cin >> n;
13     int len = 3 * n;
14     vector<int> nums(len);
15     for (int i = 0; i < len; i++)
16         cin >> nums[i];
17     
18     sort(nums.begin(), nums.end());
19     for (int i = 3 * n - 2; i >= n; i -= 2)
20         sum += nums[i];
21     
22     cout << sum << endl;
23     
24     return 0;
25 }
View Code:

 

posted on 2017-05-27 22:43  dxy1993  阅读(147)  评论(0编辑  收藏  举报