9.11流利说笔试第一题礼物派发求讨论

思路:先求出甲乙两地给第i名用户寄礼物的费用的差值的绝对值,然后对差值做一个排序。下一步,要往list里存入差值排序前的角标,为了避免差值一样的情况时存入同样的角标,所以我设置了标志位,存入过list的角标不会再次存入。(我这里用的方法好笨,又遍历了一遍找出的角标,可以不可以对差值的绝对值排序的时候把角标也存进去阿?)。最后,比较甲乙两地费用的大小,取小的加入到最终的结果count中。题中给出的是a+b>=n,,,count做n次加法就可以跳出了,如果a或者b提前到了0,那么剩下的全从另一地取了,加continue是为了避免多运行下面的if语句。最后的for循环里,保证每次循环只对count做一次加法。

当时做的时候,觉得存角标太傻了,没继续写下去,再加上时间赶,就没写出来/。所以目前写的这个不知道能ac多少,用例可以过。
import java.util.ArrayList;
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();
        //a表示甲仓库存放的礼物数量,b表示乙仓库存放的礼物数量
        int a = sc.nextInt();
        int b = sc.nextInt();
        //从甲地给第i名用户寄礼物的费用
        int[] c = new int[n];
        //从乙地给第i名用户寄礼物的费用
        int[] d = new int[n];
        for(int i = 0;i < n;i++){
            c[i] = sc.nextInt();
            d[i] = sc.nextInt();
        }
        int[] cha = new int[n];
        for(int i=0;i < n;i++){
            cha[i] = Math.abs(c[i] - d[i]);
        }
        //对差值进行排序
        Arrays.sort(cha);
        //存储差值对应的角标
        ArrayList<Integer> list = new ArrayList<>();

        boolean[] flag = new boolean[n];
        for(int i = n-1;i >=0;i--){
            for(int j=0;j < n ;j++){
                if(flag[j] == true){
                    continue;
                }
                if(Math.abs(c[j] - d[j]) == cha[i]){
                    list.add(j);
                    flag[j] = true;
                    break;
                }
            }
        }
        //结果值
        int count = 0;
        for(int i = 0;i < n;i++){
            if(a == 0){
                count += d[list.get(i)];
                b--;
                continue;
            }
            if(b == 0){
                count += c[list.get(i)];
                a--;
                continue;
            }
            if(c[list.get(i)] < d[list.get(i)]){
                count += c[list.get(i)];
                a--;
            }else{
                count += d[list.get(i)];
                b--;
            }
        }

        System.out.println(count);

    }
}


#笔试题目##流利说##题解#
全部评论
是这样的思路
点赞 回复
分享
发布于 2019-09-11 23:30
滴滴
校招火热招聘中
官网直投
楼主可以试试重写类比较器,自定义排序
点赞 回复
分享
发布于 2019-09-11 23:39
思路一样,我用go写的,写了个结构体分别存差值,正负和下角标
点赞 回复
分享
发布于 2019-09-11 23:52
不是网络流简单题吗
点赞 回复
分享
发布于 2019-09-12 00:43
我也是一样的思路,写了好久没写完就到时间了😥本来想用类封装起来属性,但是比较器一下忘记怎么override了,尴尬
点赞 回复
分享
发布于 2019-09-12 01:22
楼主,我也是这个思路。就是用个pair的结构来存,第一个元素存角标,第二个元素存差,然后排序。按顺序取。这个是AC的代码 #include <iostream> #include <vector> #include <utility> #include <algorithm> using namespace std; bool cmp(pair<int, int> a, pair<int, int> b){     return a.second > b.second; } int main() {     int res = 0;     int n;     cin >> n;     int a, b;     cin >> a >> b;     vector<int> posA;     vector<int> posB;     vector<pair<int, int>> diff;     for(int i = 0; i < n; i++){         int x, y;         cin >> x >> y;         posA.push_back(x);         posB.push_back(y);         diff.push_back(make_pair(i, x > y ? x-y:y-x));     }     sort(diff.begin(), diff.end(),cmp);     for(int i = 0; i < n; i++){         int index = diff[i].first;         if(posA[index] > posB[index] && b > 0){             res += posB[index];             b--;         }else if(posA[index] < posB[index] && a > 0){             res += posA[index];             a--;         }else if(b <= 0){             res += posA[index];             a--;         }else{             res += posB[index];             b--;         }     }     cout<<res;     return 0; }
点赞 回复
分享
发布于 2019-09-12 10:11

相关推荐

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