腾讯笔试第三题思路哪错了&第四题为什么topk超时

第三题把一个数组分成两个数组a1,a2,要求两个数组长度差不超过1并且数组和的差sum(a1)-sum(a2)最小。
我的想法是原数组排序后从最后大的开始分配,a1的和小就分配到a1,a2和小就a2。直到分配完或者某一个数组的长度到达原数组长度的一半,把剩下的都分到另一个数组里去(原数组长度奇数的话,留下一个最小值分给和小的)。然后一个case也没过⊙▽⊙,自己没测试出会出错的case,不知道哪里错了。

第四题是类似于topk堆排,一次次找最小,如果减去该减的值小于零不符合条件就继续找下一个最小。为啥只过了0.7?有更好的方法吗?

#腾讯#
全部评论
我想到反例了 就比如说这样做下来a1比a2和小2,但a1中恰好有个7然后a2里有个8,这俩虽然当初因缘际会放进了现在的位置,但现在一交换就可以让数组和的差更小。
点赞 回复
分享
发布于 2019-09-20 22:41
第四题没那么复杂 #include <bits/stdc++.h> int main(int argc, const char* argv[]) {     std::ios::sync_with_stdio(false);     size_t N, K;     std::cin >> N >> K;     std::vector<size_t> val(N);     for(size_t i = 0; i < N; i++) {         std::cin >> val[i];     }     std::sort(val.begin(), val.end());     size_t idx = 0;     size_t previous = 0;     for(size_t i = 0; i < K; i++) {         if(idx == N) {             std::cout << "0\n";             continue;         }         std::cout << val[idx] - previous << std::endl;         previous = val[idx];         for(; idx < N; idx++) {             if(val[idx] != previous) {                 break;             }         }     }     return EXIT_SUCCESS; } 第三题举反例,最大数远大于其他数,然后最佳解应该是【最大数+较小的一半数】/【除了最大外的较大的一半数】
点赞 回复
分享
发布于 2019-09-20 22:18
联易融
校招火热招聘中
官网直投
但是自己怎么会知道哪个case会出错呢
点赞 回复
分享
发布于 2019-09-20 22:13
(后端题,第三题是员工有战斗力,游戏分组,分成人数差不多战斗力也差不多的两组玩游戏。第四题是不断找不为0的最小值输出然后剩下的减掉这个最小值)
点赞 回复
分享
发布于 2019-09-20 22:13
。。。。你这个
点赞 回复
分享
发布于 2019-09-20 22:14
第四题,实际上就是排序后求差分 #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() {     int n, k;     cin >> n >> k;     vector<int> arr(n);     for(int i = 0; i < n; i++) cin >> arr[i];     sort(arr.begin(), arr.end());     int j = 0;     cout << arr[j] << endl;     j++;     int i = 1;     while(j < n){         if(arr[j-1] == arr[j]){             j++;             continue;         }         else{             cout << arr[j] - arr[j-1] << endl;             j++;             i++;             if(i >= k) break;         }     }     for(j = i; j < k; j++) cout << 0 << endl;     return 0; }
点赞 回复
分享
发布于 2019-09-20 22:14
第四题是因为代码太耗时吗?我的太暴力了 所以运行不完所有的case 只AC了0.6😶️
点赞 回复
分享
发布于 2019-09-20 22:15
第3题贪心肯定不行的,我也想不出怎么做😂 第4题我用堆排AC了(用的是STL里面的set)
点赞 回复
分享
发布于 2019-09-20 22:16
第四题AC过了 不需要一直找0 就是找差值的过程 import java.util.Arrays; import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         int n = sc.nextInt();         int m = sc.nextInt();         int[] a = new int[n];         for (int i = 0; i < n; i++) {             a[i] = sc.nextInt();         }         int[] c = getResult(m,a);         for (int i = 0; i < m; i++) {             System.out.println(c[i]);         }     }     public static int[] getResult(int k, int[] a){         int[] b = new int[k];         if (a.length==0){             return b;         }         Arrays.sort(a);         b[0] = a[0];         int x=1;         for (int i = 1; i < a.length; i++) {             if (a[i] != a[i-1]&&x<k) b[x++] = a[i]-a[i-1];         }         return b;     } }
点赞 回复
分享
发布于 2019-09-20 22:18
大佬1、2都A了吗
点赞 回复
分享
发布于 2019-09-20 22:34
第三题你应该不能这么做,你想想,这题除了限定个数,是不是零一背包。。。贪心是不可能对的,不然就没必要用动规做零一背包了
点赞 回复
分享
发布于 2019-09-20 22:37
第四题,感觉差不多,我是存一个差值s,然后每次pop一个如果等于差值就扔掉,不然的话就打印同时更新差值,这都不用排序
点赞 回复
分享
发布于 2019-09-20 22:51

相关推荐

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