google Kickstart Round E 2018

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

Problem A. Yogurt

https://code.google.com/codejam/contest/4394486/dashboard#s=p0
主要思路:
1.先排序
2.排序完,看当前位置的过期时间和当天天数对比。如果过期时间大于天数,说明接下来的k个酸奶都没过期,直接遍历k个(如果剩余不足k则数量为剩余数目),进入下一个天数判断;如果过期时间小于等于天数,说明当前的酸奶已过期,一直向后寻找到过期时间大于天数的,在此位置开始直接遍历k个(如果剩余不足k则数量为剩余数目)。

  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

https://code.google.com/codejam/contest/4394486/dashboard#s=p1
思路:
1.用两个数组来分别表示每个位置选择1的和选择0的各自数量;这样算抱怨数的时候就可以直接计算。
2.最佳的选择是每个位置中,数目最多的那个。
3.算forbidden的时候是一个难点。这里采取穷举的方式,列一个最佳选择集。对选择集中的每一个选择,逐位替换,计算complaint。找到最小的complaint,如果不在forbidden里,说明这个选择就是最佳的;否则,把这个选择放到最佳选择集里,重复3的步骤。直到找到一个最佳选择(即不在forbidden里面的选择)
4.计算最佳选择的complaint。抱怨数即,每个位置,和最佳选择不一样的选择人数之和。

注意:
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;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容