网易2017内推C++开发笔试题

1. 有 n(输入)个奶牛,每个奶牛有 a[i](输入)个苹果,一次只能从一只奶牛处拿两个苹果(只能两个)分给另一只奶牛,问最少多少次能够让所有奶牛均分苹果。若不能,输出-1;
2.飞行器,上升损耗 x,下降损耗对应上升为 x^2,现在耐损耗度为 h(输入)。若损耗超过耐损耗度则飞行器爆炸。求最大的 x 。
3.分田地,m * n 大小的矩阵,每个元素为 0~9,横竖各切3刀,分成16块,只能取16块中最小的一块。所有切法中能拿到的最大的一块的值是多少。

PS:第三题没有做。求各位大神给个思路,贴份代码最好啦~

第一题代码:

全部评论
用C/C++,第一题第二题一直显示正在提交,一个小时,最后延时系统出测试无效之类的,到最后都不知道对不对,第三题,有个错误没改,提交错误了 第一题: #include<iostream> #include<algorithm> using namespace std; #define N 100 int juest(int *a,int num) { int sum=0, renum = 0; for (int i = 0; i < num; i++) { sum = sum+a[i]-9; if (abs(a[i] - 9) % 2 != 0) return -1; renum += abs(a[i] - 9) / 2; } if (sum != 0) return -1; else return renum / 2; return -1; } int main() { int num; while (cin >> num) { int str[N],err[N]; for (int i = 0; i < num;i++) { cin >> str[i]; err[i] = str[i] - 9; } cout << juest(str, num) << endl; } } 第二题: #include<iostream> #include<algorithm> using namespace std; int main() { int num; while (cin >> num) { int i = (int)sqrt(num); if ((i*i+i)<num) cout << i << endl; else if ((i - 1)*(i - 1) + (i - 1)<num) cout << i - 1 << endl; } return 0; } 第三题: #include<iostream> #include<cstdlib> #include<ctime> #include<algorithm> using namespace std; #define MAX 100 int main() { srand(unsigned(time(NULL))); int n, m; int arr[MAX][MAX]; int min; while (cin >> n) { cin >> m; for (int i = 0; i<n; i++) for (int j = 0; j<m; j++) { scanf_s("%1d",&arr[i][j]); } min = arr[0][0]; for (int i = 0; i<n; i++) for (int j = 0; j<m; j++) { if (arr[i][j]<min) min = arr[i][j]; } cout << min << endl; } return 0; } 不知道我又没有理解错题,有没有编错,大家轻虐求指正。
点赞
送花
回复
分享
发布于 2016-08-02 23:09
第一题: #include <iostream> #include <vector> using namespace std; int numOfplan(); int main() { cout << numOfplan() << endl; return 0; } int numOfplan() { int n; cin >> n; vector<int> arr(n); int sum = 0; for (int i = 0; i < n; i++) { cin >> arr[i]; sum += arr[i]; } if (sum % arr.size() != 0) return -1; int avg = sum / arr.size(); int iCount = 0; for (unsigned int i = 0; i < arr.size(); i++) { if ((arr[i] - avg) % 2 == 0) iCount += (arr[i] - avg) > 0 ? (arr[i] - avg) / 2 : (avg - arr[i]) / 2; else return -1; } return iCount & 1 ? -1 : iCount / 2; } 第二题: #include <vector> #include <iostream> #include <cmath> using namespace std; long long _maxWastage1(long long h); // 方法1 long long _maxWastage2(long long h); // 方法2 int main() { // 由于 10^18 在 long long 的表示范围内 long long h; cin >> h; cout << _maxWastage2(h) << endl; return 0; } long long _maxWastage1(long long h) { long long result = sqrt(h); for (long long i = result - 1; i >= 0; i--) { if (i + i * i < h) return i; } return 0; } long long _maxWastage2(long long h) { long long left = 0; long long right = h; long long mid = 0; while (left < right) { mid = (right + left + 1) >> 1; if (mid + mid * mid > h) right = mid - 1; else left = mid; } return left; } 第三题: #include <iostream> using namespace std; bool is_ok_(int _m); bool is_ok(int l, int r, int _m); #define MAXN (500+10) #define MAXM (500+10) #define MAXT (2000000+10) int a[MAXN][MAXM], sum[MAXN][MAXM] = { 0 }; int n, m; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> a[i][j]; sum[i][j] = sum[i - 1][j] + a[i][j]; } } int left = 1, right = 1, ans = 0; for (int j = 1; j <= m; j++) right += sum[n][j]; for (int i = 1; i <= 60; i++) { int mid = (left + right) / 2; if (is_ok_(mid)) { left = ans = mid; } else right = mid; } cout << ans << endl; return 0; } bool is_ok_(int _m) { int p = 0, l = 1; for (int i = 1; i <= n; i++) { if (is_ok(l, i, _m)) { l = i + 1; p++; } } if (p >= 4) return 1; else return 0; } bool is_ok(int l, int r, int _m) { int tot = 0, p = 0; for (int i = 1; i <= m; i++) { tot += sum[r][i] - sum[l - 1][i]; if (tot >= _m) { tot = 0; p++; } } if (p >= 4) return 1; else return 0; }
点赞
送花
回复
分享
发布于 2016-08-03 14:18
滴滴
校招火热招聘中
官网直投
第一题: #include <iostream> #include <queue> #include <vector> using namespace std; int main() { int n; int i, j, k; int sum; int avg; vector<int> start; int count; bool flag; while (cin >> n) { sum = 0; for (i = 0; i < n; i++) { cin >> j; start.push_back(j); sum += j; } if (sum%n != 0) { cout << "-1" << endl; continue; } avg = sum/n; count = 0; flag = true; for (i = 0; i < n; i++) { if (start[i] > avg && (start[i]-avg)%2 != 0) { cout << "-1" << endl; flag = false; break; } if (start[i] < avg && (avg-start[i])%2 != 0) { cout << "-1" << endl; flag = false; break; } if (start[i] > avg) { count += (start[i]-avg)/2; } } if (flag) { cout << count << endl; } start.clear(); } return 0; } 
点赞
送花
回复
分享
发布于 2016-08-02 22:48
第二题用long long 直接开方就行
点赞
送花
回复
分享
发布于 2016-08-02 22:49
第一题: #include<iostream> #include<vector> using namespace std; int main(){ int n; while(cin>>n){ vector<int> a(n); int sum=0,ans=0,flag=1; for(int i=0;i<n;i++){ cin>>a[i]; sum+=a[i]; } if(sum%n != 0){ cout<<-1<<endl; flag=0; } else{ int avg=sum/n; for(int i=0;i<n;i++){ if((a[i]-avg)%2 != 0){ flag=0; cout<<-1<<endl; break; } else if(a[i]>avg) ans+=a[i]-avg; } } if(flag) cout<<ans/2<<endl; } return 0; } 第二题: #include<iostream> using namespace std; int main(){ long long n; while(cin>>n){ long long left=0,right=n,mid; while(left!=right){ mid=(right+left+1)/2; if((n-mid)*1.0/mid < mid) right=mid-1; else left=mid; } mid=left; cout<<mid<<endl; } return 0; }
点赞
送花
回复
分享
发布于 2016-08-02 22:53
第一题:先求平均值T,如果平均值不能被N整除,输出-1,然后排序那个数组,从头到末尾遍历,判断所有的指与平均值的差的绝对值是否能被二整除,如果不能,直接跳出输出-1,否则将小于平均值的数被平均值减,然后除以二,相加就是最少次数。 第二题:刚开始做从1循环,提示我超时,后来开根号,然后递减,加快时间,就行了, 第三题:不会
点赞
送花
回复
分享
发布于 2016-08-02 23:10
手机码一下第一题的思路: 首先计算平均值,能被n整除就继续,不能就输出-1; 然后计算每一个值和平均值的差,如果能被2整除再判断差值是否为正,为正就将移动次数加上差值除2;反正不能被2整除就输出-1……最后输出次数
点赞
送花
回复
分享
发布于 2016-08-02 23:32
#include<iostream> #include<string> #include <algorithm> #include<vector> using namespace std; int main(){ int n; while (cin>>n) { vector<int> vec; int sum=0; for(int i=0;i<n;i++) { int m; cin>>m; sum+=m; vec.push_back(m); } if(sum%n!=0) { cout<<-1<<endl; continue; } int avr = sum/n; int ans = 0; int time = 0; int flag = 0; for(int i=0;i<n;i++) { int tmp = abs(vec[i]-avr); if(tmp%2!=0) { cout<<-1<<endl; flag=1; break; } if(vec[i]>avr) { ans += tmp; time+=tmp/2; } else if(vec[i] == avr) { continue; } else if(vec[i] <avr) { ans -= tmp; } } if(!flag) { if(ans!=0) cout<<-1<<endl; else cout<<time<<endl; } } return 0; } 我不知道为什么超时了 求大神指点
点赞
送花
回复
分享
发布于 2016-08-03 10:18
#include<iostream> #include <math.h> using namespace std; int main() { long long h; int max=0; cin>>h; for(long long i=0;i<=sqrt(h);i++) { if(i*(i+1)<=h) { max=i; } else { break; } } cout<<max<<endl; return 0; } 昨天这种做法没做完,现在不知道这种做法能不能通过
点赞
送花
回复
分享
发布于 2016-08-03 11:12
第二题就是 x^2+x<h 求解啊,一个求根公式就好了
点赞
送花
回复
分享
发布于 2016-08-03 15:32
第三体就是考察组合。。http://blog.csdn.net/lsxpu/article/details/52100370
点赞
送花
回复
分享
发布于 2016-08-04 15:10

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务