搜狐第二题,ac代码
转换成如下问题:k = ±1±2±3……±n,求给定k且等式有解的最小n,(代码利用了给定|k|<2w的条件)
先所有当加号处理,+变-在和上看相当于减了这个数的2倍
static int get(int k) { k = Math.abs(k); if (k > 20050) return 0; if (k <= 1) return k; int[] sum = new int[220]; for (int i = 0; i < 220; i++) { sum[i] = i * (i + 1) / 2; } int bound = 0; for (int i = 0; i < 220; i++) { if ((sum[i] <= k) && (sum[i + 1] > k)) { bound = i; break; } } if (sum[bound] == k) return bound; for (int i = 1; ; i++) { if ((sum[bound + i] - k) % 2 == 0) { return bound + i; } } }
为什么sum[bound + i] - k)是偶数时一定能分解成前面数的和:可分奇偶数讨论,这里i一定小于4