刚拿到题目,想的是用目标和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") 
京公网安备 11010502036488号