public class ThreeIncreasing { public int minEaten(int a, int b, int c) { int b_change = max(0, b - (c - 1)); // decrease b to c-1 b -= b_change; int a_change = max(0, a - (b - 1)); // decrease a to b-1 a -= a_change; if(a <= 0) return -1; return a_change + b_change; } } public class SellingFruits { public int maxDays(int x, int f, int d, int p) { int low = 0, high = d; while(low < high) { int days = (int) (((long) low + high + 1) / 2); long needMoney = (long) days * x + (long) p * max(0, days - f); if(needMoney <= d) low = days; else high = days - 1; } return low; } } public class MappingABC2 { public int countStrings(int[] t) { final int MOD = 1000 * 1000 * 1000 + 7; int n = t.length; int MAX_VAL = 0; for(int i = 0; i < n; ++i) { MAX_VAL = max(MAX_VAL, t[i]); --t[i]; } boolean appears[] = new boolean[MAX_VAL]; for(int i = 0; i < MAX_VAL; ++i) appears[i] = false; for(int x : t) appears[x] = true; int answer = 0; for(int a0 = 0; a0 < n; ++a0) for(int b0 = a0 + 1; b0 < n; ++b0) for(int c0 = b0 + 1; c0 < n; ++c0) { boolean a[] = new boolean[MAX_VAL]; boolean b[] = new boolean[MAX_VAL]; boolean c[] = new boolean[MAX_VAL]; for(int x = 0; x < MAX_VAL; ++x) a[x] = b[x] = c[x] = true; for(int i = 0; i < a0; ++i) a[t[i]] = false; // no 'A' b[t[a0]] = c[t[a0]] = false; // first 'A' for(int i = a0 + 1; i < b0; ++i) b[t[i]] = false; // no 'B' a[t[b0]] = c[t[b0]] = false; // first 'B' for(int i = b0 + 1; i < c0; ++i) c[t[i]] = false; // no 'C' a[t[c0]] = b[t[c0]] = false; // first 'C' int product = 1; for(int i = 0; i < MAX_VAL; ++i) if(appears[i]) { int ways = (a[i]?1:0) + (b[i]?1:0) + (c[i]?1:0); product = (int) ((long) product * ways % MOD); } answer = (answer + product) % MOD; } return answer; } }