B. 점프 (시뮬레이션)

B. 테스트
당 시간 제한 점프
테스트 당 1 메모리 제한 256 메가 바이트
입력 표준 입력
출력 표준 출력
점 0에서 OX 축에 서 있고 정수 점 x> 0으로 이동하려고합니다.

여러 번 점프 할 수 있습니다. 현재 y 지점 (y는 음수 일 수 있음)에 있고 k 번째로 점프한다고 가정합니다. 다음을 수행 할 수 있습니다.

점 y + k로
점프하거나 점 y-1로 점프합니다.
x 지점에 도달하는 데 필요한 최소 점프 횟수는 얼마입니까?

입력
첫 번째 줄에는 테스트 케이스 수인 단일 정수 t (1≤t≤1000)가 포함됩니다.

각 테스트 케이스의 첫 번째이자 유일한 행에는 단일 정수 x (1≤x≤106) 인 대상 지점이 포함됩니다.

출력
각 테스트 케이스에 대해 단일 정수 (x에 도달하기위한 최소 점프 수)를 인쇄합니다. 어떤 정수 점 x에도 도달 할 수 있다는 것을 증명할 수 있습니다.

예제
inputCopy
5
1
2
3
4
5
outputCopy
1
3
2
3
4
참고
첫 번째 테스트 케이스 x = 1에서는 한 번의 점프 만 필요합니다. 첫 번째 점프는 0에서 0 + 1 = 1입니다.

두 번째 테스트 케이스에서 x = 2. 최소한 세 번의 점프가 필요합니다.

0에서 0 + 1 = 1로 첫 번째 점프;
1에서 1 + 2 = 3으로 2 번째 점프;
3에서 3-1 = 2로 3 번째 점프;
두 번의 점프는 가능한 유일한 변형이기 때문에 충분하지 않습니다.

첫 번째 점프는 −1로, 두 번째 점프는 −1로 — 0−1−1 = −2에 도달합니다.
첫 번째 점프는 −1로, 두 번째 점프는 +2로 — 0-1 + 2 = 1에 도달합니다.
첫 번째 점프는 +1로, 두 번째 점프는 -1로 — 0 + 1-1 = 0에 도달합니다.
첫 번째 점프는 +1로, 두 번째 점프는 +2로 — 0 + 1 + 2 = 3에 도달합니다.
세 번째 테스트 케이스에서는 두 번의 점프가 필요합니다. 첫 번째는 +1이고 두 번째는 +2이므로 0 + 1 + 2 = 3입니다.

네 번째 테스트 사례에서는 세 번의 점프가 필요합니다. 첫 번째는 −1, 두 번째는 +2, 세 번째는 +3이므로 0−1 + 2 + 3 = 4입니다.

질문 의미 : 0 0
부터0 시가
먼저kkk 단계에 대해 두 가지 선택이 가능합니다.

  1. 앞으로 kkk 단계 + k
  2. 뒤로 이동 1 11 단계 -1
    nn으로 이동하도록 요청합니다.최소한 n 에서 몇 단계를 거쳐야합니까?

솔루션 :
사실 매우 간단한 시뮬레이션입니다. 매번 앞으로 나아가면 1 + 2 + 3 + 4 ..... + x = y 1 + 2 + 3 + 4 ... + x = y1+2++4 . . . . .+엑스=y就是y = (n + 1) * n / 2 y = (n + 1) * n / 2와이=( n+1 )n / 2 .
그런 다음 y-2로 이동해야합니다.+ 1 +1을더할 수 있습니다.+ 1은 − 1 -1로변경됩니다.1 .
이동Y - 3 Y-3와이3 우리는+ 2 + 2를더할 수 있습니다+ 2는 − 1 -1로변경됩니다.1

~y − x + 1 y-x + 1와이엑스+1 우리는+ (x − 2) + (x-2)를더할 수 있습니다+ ( x2 ) 에서− 1 -11
은 실제로yy에 있음y- 변경된 단계 수zzz− 1 -1로변경1 과 빼기1 11 이므로적어도 2 2를 빼야합니다.2 . Y - 1 Y-1와이1 우리는 그를yy만 들여 보낼 수 있습니다y 는 한 발 뒤로 물러났습니다.

그래서 우리는
(1) 을 추론합니다 .If (n + 1) ∗ n / 2 = y (n + 1) * n / 2 = y( n+1 )n / 2=y 그럼 그냥nnn 단계
(2). If(n + 1) ∗ n / 2 = y + 1 (n + 1) * n / 2 = y + 1( n+1 )n / 2=와이+1 그럼 그냥nnn 단계 한 다음 뒤로 돌아 가면n + 1 n + 1입니다.+1 단계.
(3) 다른 것들은 우리가nn을 분석 한 것과 실제로 동일합니다.n 단계.

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n;
ll sum;
ll dp[1000100];
string str;
int main() {
    
    
    int t;
    cin>>t;

    while(t--) {
    
    
        cin>>n;
        int i = 1;
        for(; i * (i + 1) / 2 < n; i ++);
        sum = i * (i + 1) / 2;
        if(sum == n) {
    
    
            cout << i << endl;
        } else if(sum == n + 1) {
    
    
            cout << i + 1 << endl;
        } else cout << i << endl;
    }
    return 0;
}

추천

출처blog.csdn.net/weixin_45911397/article/details/110528296