题解 | #序列和#
序列和
http://www.nowcoder.com/practice/46eb436eb6564a62b9f972160e1699c9
刚拿到题目,想的是用目标和N去逐个除以L(L逐渐递增),因为是连续的正整数,因此可以通过整除的方式找到序列的中位数。如果是L是偶数,其中位数如果是几点五,那么往前后分别找L/2个数即可;如果L是奇数,那么中位数是整数,分别往前后找L/2-1个数;其余情况长度L需要自增。
题解:是通过递增数列的递推公式来处理的,通过公式求出首项。以下是Java和python的解法:
import java.util.Scanner; public class Main{ public static void solution(int N, int L){ // 连续非负整数,长度尽可能短,所有数之和位N int i = L; while ( i <= 100){ if ((2 * N - i*(i - 1)) % (2 * i)==0){ int a1 = (2 * N - i*(i - 1)) / (2 * i); for (int j = 0; j < i-1; j++){ System.out.print(a1+" "); a1++; } System.out.println(a1); break; } i++; // 不能整除,长度加1 } if(i>100) System.out.println("No"); return; } public static void main(String[] args){ Scanner s = new Scanner(System.in); int N = s.nextInt(); int L = s.nextInt(); solution(N,L); } }
import math N, L = map(int, input().split()) i = L while i <= 100: a = (2 * N - i*(i - 1)) / (2 * i) if math.ceil(a) == a: for j in range(i- 1): print(int(a), end=" ") a += 1 print(int(a)) break i += 1 if i == 101: print("No")