momosmile level
获赞
91
粉丝
5
关注
22
看过 TA
5
上海交通大学
2017
Java
IP属地:未知
暂未填写个人简介
私信
关注
2016-08-03 14:59
已编辑
上海交通大学 Java
1. 有 n(输入)个奶牛,每个奶牛有 a[i](输入)个苹果,一次只能从一只奶牛处拿两个苹果(只能两个)分给另一只奶牛,问最少多少次能够让所有奶牛均分苹果。若不能,输出-1; 2.飞行器,上升损耗 x,下降损耗对应上升为 x^2,现在耐损耗度为 h(输入)。若损耗超过耐损耗度则飞行器爆炸。求最大的 x 。 3.分田地,m * n 大小的矩阵,每个元素为 0~9,横竖各切3刀,分成16块,只能取16块中最小的一块。所有切法中能拿到的最大的一块的值是多少。 PS:第三题没有做。求各位大神给个思路,贴份代码最好啦~ 第一题代码:
我不是猪:第一题: #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; }
投递网易等公司10个岗位 >
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务