목차
1. 주제 소개
왕은 충성스러운 기사들에게 임금으로 금화를 주었습니다.
기사는 첫째 날에 금화 1개를 받고, 그 다음 2일(둘째, 셋째 날)에는 매일 두 개의 금화를 받고, 그 다음 3일(넷째, 다섯째, 여섯째 날)에는 세 개의 금화를 받습니다. 매일 금화 ;다음 4일(7일, 8일, 9일, 10일) 동안 매일 4개의 금화를 받았습니다...; 이 급여 분배 모델은 계속됩니다.
연속 N일 동안 매일 N개의 금화를 받은 기사는 연속 N+1일 동안 매일 N+1개의 금화를 받습니다.
지난 K일 동안 기사가 획득한 금화의 개수를 계산하십시오.
제목 출처: Niu Ke BC96
2. 주제 요건
설명 입력:
입력에는 금화 발행 일수를 나타내는 양의 정수 K가 포함된 한 줄만 있습니다.
출력 설명:
출력은 기사가 받은 금화의 수인 양의 정수를 포함하는 단 한 줄입니다.
3. 문제 해결 아이디어
위의 그림과 같이 삼각형 첨탑과 마찬가지로 각 행의 항목 수는 행의 수와 같고 각 행의 항목 수로 표시되는 금화의 수는 숫자와 같습니다. 행의.
따라서 행수×항목수 문제인 회절, 즉 i * j 또는 i * i 로 구할 수 있다.
따라서 라인의 수를 금화의 수로 설정할 수 있으며, 한 라인의 아이템이 모두 소진되면 다음 라인으로 진입하여 골드 코인의 수를 늘릴 수 있습니다. 며칠. 하루.
그리고 일수가 다가올수록 걸을 수 있는 아이템의 수가 지속적으로 줄어들고 있기 때문에 남은 일수가 이 행의 모든 아이템을 완성할 수 있을지 판단하기 위해 일수를 판단할 필요가 있다.
수학적 모델로 변환:
k를 일 수라고 합니다.
i를 항목의 수라고 하고 i는 금화의 수를 나타내는 행 수를 나타냅니다.
i * i는 한 줄의 모든 항목을 완료하는 금화의 숫자로, 한 줄의 총 금화 수를 나타냅니다.
합계 = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 +…
합계 = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 +…
4. 코드 데모
int main()
{
int k;
int i = 1;
int result = 0;
scanf("%d", &k);
while (k > 0)
{
if (k >= i)
result += i * i;
else
result += k * i;
k -= i; //天数在不断的减少
i++; //完成 一行后 金币数需要加1
}
printf("%d\n", result);
return 0;
}
//k > = i 表示当天数大于等于项数时,可以走完一行,所以使用 i * i ,行数(金币数) × 项数
//k < i 表示当天数小于项数时,则要求该项所在的行数(金币数) * 天数 得到剩余天数的所有金币