Menu Sidebar
Menu

August 2015

Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2) C. Bear and Poker

原题: http://codeforces.com/contest/574/problem/C 题目大意: 给一个n个数的数组, 问这几个数能不能通过double或者triple得到一个相同的数. 分析: 几个数能通过double或者triple得到一个相同的数, 必然这几个数由2 或者(和) 3的倍数组成, 所以这几个数可以分解成2^a*3^b* rest, 所以我们先要把每个数的2的倍数和3的倍数都消去, 然后检查rest部分是不是相同, 即可判断是不是可以通过double和triple组成相同的数. public void solve(int testNumber, InputReader in, OutputWriter out) { int n = in.readInt(); int[] ary = IOUtils.readIntArray(in,n); for (int i = 0; i < n; i++) { ary[i] = modify(ary[i]); } for (int i = 1; i < n; i++) { […]

Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2) B. Bear and Three Musketeers

原题: http://codeforces.com/contest/574/problem/B 题目大意: 给一个无向图, 问你是不是有三个点互联, 并且算出所有三点互联情况下, 这三点的degree的合. 分析: 开始的时候, 看到4000的顶点数, 先想的就是直接暴, 后来发现第7个test case 过不了,  中间加了个简单的剪枝, 立刻就过了. 先把图建起来, 然后用个array存一下每个点的度, 最后用结果减去6(三个点互相连接的度), 就是这三点和其他点度的合. public void solve(int testNumber, InputReader in, OutputWriter out) { int n = in.readInt(); int m = in.readInt(); int[] h = new int[n+1]; boolean[][] g = new boolean[n+1][n+1]; for (int i = 0; i < m; i++) […]

Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2) A. Bear and Elections

原题: http://codeforces.com/contest/574/problem/A 题目大意: 给一个n的数的数组, 问如何让第一个数拿最少数组中别的数字的数,使得第一个数变成这个数组最大的数. 分析: 这题的做法很多, 我开始的时候暴了一下, 发现过不了, 暴的复杂度是O(n2), 看来能有lgn的做法. 后来想想, 假设第一个数是数组中最大的数, 那么就可以不用拿别的数, 如果第一个数不是数组中最大的数, 那么它最多拿的数, 应该是数组中最大的数. 假设数组: 5 1 11 2 8. 第一个数5不是数组中最大的数字, 那么我们可以假设, 最坏情况下, 我们最多拿11(11为数组中最大的数字), 使得5变成数组中最大的数字, 当然这个情况是最坏情况. 其次, 上面例子中的5 1 11 2 8的结果是4, 那么我们可以证明, 任何大于4的数字都是可以的. 因此, 我们可以通过二分搜索的办法, 搜索这个数字. 复杂度是o(nlgn), n是每次检查搜索结果的正确性, lg是二分. public void solve(int testNumber, InputReader in, OutputWriter out) { int n = in.readInt(); int[] […]

WePay 面试

Wepay的面试很容易拿, 扔个简历过去,很快就换个oa回来. oa的题也很固定2个选择题, 1个设计hashtable题. 但是这个hashtable题很奇葩, 因为oa就30分钟, 而且用的是hackerrank的环境, 根本没法复制粘贴,全靠手敲代码+测试, 要求是能支持put和get方法, 并且是有抽象参数, 并且还要能解决hash冲突. 然后我敲了下面的代码, 居然说oa没过..然后发网上, 问了过了的同学怎么写的…大家纷纷表示我写的很好- –  move on 了 import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; public class myHashTable<K, V> { class Entry<K, V> { public Entry(K key, V value) { this.key = key; this.value = value; } K key; V value; } private int size = […]

Missing Number 位运算

public int missingNumber(int[] nums) { if(nums.length == 0 || nums == null) return 0; int missing = 0; for(int i = 0; i <= nums.length; i++) missing ^= i; for(int i = 0 ; i < nums.length; i++) { missing ^= nums[i]; } return missing; }  

Codeforces Round #317 [AimFund Thanks-Round] (Div. 2) B. Order Book

原题: http://codeforces.com/contest/572/problem/B 题目大意: 对n个股票操作进行排序, 最后生成一个Order Book. 操作有两种, buy 和 sell, 后边是股票标号和价钱. 要求对相同操作的相同股票进行合并操作. 然后输出排序后前s个sell和buy的股票. 这里的排序要求是, 对于sell, 先对编号递增排序, 然后取前s (没有s个取所有). 然后再对编号递减排序. 对于buy直接递减排序即可. 分析: 用Java的TreeMap一下就出来了. 因为TreeMap本身就是有序的, 用Collections.reverseOrder()可以改变顺序. 然后取前s个的时候, 可以把set变成stream, 然后limit一下就可以 public void solve(int testNumber, InputReader in, OutputWriter out) { int n = in.readInt(); int s = in.readInt(); int cb = 0; int cs = 0; Map<Integer, Integer> BMap = […]

Codeforces Round #317 [AimFund Thanks-Round] (Div. 2) A. Arrays

原题: http://codeforces.com/contest/572/problem/A 题目大意: 给两个数组, 问是否能在第一个数组找到k个数,在第二个数组找到m个数, 使得所有在第一个数组找到的数小于第二个数组找到的数. 数组已排序. 分析: 因为数组已经排序, 所以如果在第一个数组前k个数字小于第二个数组后m个数字, 那么打印YES.如果不是, 打印NO public void solve(int testNumber, InputReader in, OutputWriter out) { int na = in.readInt(); int nb = in.readInt(); int k = in.readInt(); int m = in.readInt(); int[] naAry = IOUtils.readIntArray(in, na); int[] nbAry = IOUtils.readIntArray(in, nb); if (naAry[k – 1] >= nbAry[nb – m]) out.print(“NO”); […]

Ugly Number II

public int nthUglyNumber(int n) { int[] ugly = new int[n]; ugly[0] = 1; int m2 = 1; int m3 = 1; int m5 = 1; int f2 = 2; int f3 = 3; int f5 = 5; for(int i = 1; i < n; i++) { int min = Math.min(Math.min(f2,f3),f5); ugly[i] = min; if(min == […]

Ugly Number

public boolean isUgly(int num) { if(num == 0) return false; else if(num == 1) return true; else if(num % 2 == 0) return isUgly(num / 2); else if(num % 3 == 0) return isUgly(num / 3); else if(num % 5 == 0) return isUgly(num / 5); else return false; }

[LintCode] Copy Books

public int copyBooks(int[] pages, int k) { // write your code here int l = 0; int r = 9999999; while( l <= r){ int mid = l + (r – l) / 2; if(search(mid,pages,k)) r = mid-1; else l = mid+1; } return l; } public boolean search(int total, int[] page, int k) { […]

Older Posts

书脊

这青苔碧瓦堆, 俺曾睡风流觉, 将五十年兴亡看饱.

August 2015
M T W T F S S
 12
3456789
10111213141516
17181920212223
24252627282930
31