您的当前位置:首页正文

google Kickstart Round E 2018

来源:要发发知识网

今天下午参加了GOOGLE的笔试。被狠虐。
只ac了第一道问题。第二题一开始的思路是把0变成-1,然后算和,得到正负值。这里一来数字变换很麻烦,二来在处理0值情况时考虑有误(其实无需区分,complaint值是一样的),三来forbidden做处理的时候忽略了变换多位可能比变换1位更佳的可能。没有ac。第二题和朋友请教过,总结如下。
写下解题和思考过程。

Problem A. Yogurt

  1. 重复2直到遍历完所有的酸奶。
/**
 * @author wuyafang
 * @Title: A
 * @ProjectName Google
 * @Description: TODO
 * @date 18/8/26下午12:55
 */
import java.util.*;
import java.io.*;
public class A {
    public static void main(String[] args) {
        Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
//        Scanner in = new Scanner(System.in);
        int t = in.nextInt();  // Scanner has functions to read ints, longs, strings, chars, etc.
        for (int i = 1; i <= t; ++i) {
            int n = in.nextInt();
            int k = in.nextInt();
            int[] Anum = new int[n];
            int result=0;
            for(int j=0;j<n;j++){
                Anum[j]=in.nextInt();
            }
            if(k==n){
                result = n;
            }else {
                Arrays.sort(Anum);
                for(int j=0,count=0;j<n;count++){
                    while(j<n&&Anum[j]<=count){
                        j++;
                    }
                    if(j+k<n){
                        result+=k;
                        j=j+k;
                    }else if(j>=n) {
                        break;
                    }else {
                        result+=n-j;
                        j=n;
                    }
                }
            }
            System.out.println("Case #" + i + ": " + result);
        }
    }
}

Problem B. Milk Tea

注意:
1.一开始在第三步中,想通过每次去替换最优值去得到新的最优选择(做法是选择替换两数组相差值最小的)。感觉可行,但是必须辅助以最佳选择集。有一种特殊情况就是,替换2位比替换一位的抱怨更少。
举例
1
4 4 4
1110
1010
0100
0000
0000
1000
0100
0010

初始的最佳选择可能是0000
但是被禁止了,如果按照先替换1位,再替换两位的思路,我们最后的最佳选择为0001,但是这个选择的complaint数为12;而如果替换2位,变成1010,complaint数只有6。
这就是为什么我们需要每次choice替换时,选择complaint最小的,而且需要再遍历结束后,把这个选择放回到最佳选择集中的原因。而且,由于替换多位和替换1位需要进行complaint数比较,所以我们不能把替换过的choice剔除出最佳选择集中。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * @author wuyafang
 * @Title: B
 * @ProjectName Google
 * @Description: TODO
 * @date 18/8/26下午2:31
 */
public class B {
    public static void main(String[] args) {
//        Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();  // Scanner has functions to read ints, longs, strings, chars, etc.
        for (int i = 1; i <= t; ++i) {
            int n = in.nextInt();
            int m = in.nextInt();
            int p = in.nextInt();
            int[] count0 = new int[p];
            int[] count1= new int[p];
            LinkedList<String> not = new LinkedList<String>();
            for(int j=0;j<n;j++) {
                String temp = in.next();
                for(int y=0;y<p;y++) {
                    if (temp.charAt(y) == '0') {
                        count0[y]++;
                    } else {
                        count1[y]++;
                    }
                }
            }
            for(int j=0;j<m;j++) {
                String temp = in.next();
                not.add(String.valueOf(temp));
            }

            StringBuilder res = new StringBuilder();
            //找到理想的
            for(int j=0;j<p;j++) {
                if(count0[j]>count1[j]){
                    res.append('0');
                }else{
                    res.append('1');
                }
            }
            String tempString = res.toString();
            HashSet<String> resultSet = new HashSet<String>();
            resultSet.add(tempString);
            while(not.contains(tempString)){
                int min = Integer.MAX_VALUE;
                for(String choice:resultSet){
                    for(int b = 0; b < p; ++b) {
                        StringBuilder sb = new StringBuilder(choice);
                        sb.setCharAt(b,sb.charAt(b)=='1'?'0':'1');
                        String curString = sb.toString();
                        if(resultSet.contains(curString)){
                            continue;
                        }
                        int temp = getComplaint(curString,count0,count1);
                        if(temp<min){
                            min = temp;
                            tempString = curString;
                        }
                    }
                }
                if(not.contains(tempString)){
                    resultSet.add(tempString);
                }else{
                    break;
                }
            }
            int result = getComplaint(tempString,count0,count1);
            System.out.println("Case #" + i + ": " + result);
        }
    }

    private static int getComplaint(String tempString,int[] count0,int[] count1){
        int result =0;
        for(int j=0;j<tempString.length();j++){
            if(tempString.charAt(j)=='1'){
                result+=count0[j];
            }else {
                result+=count1[j];
            }
        }
        return result;
    }
}