1011 : Fly me to the Alpha Centauri


何の問題ですか。


数学の問題だけです.

奥応?


この問題は全部で3回挑戦したことがある.このうち2番は試さずに投げ出し、成功した.
いったい何の問題なのか.

問題から手がかりを探る


初めての試みでは、ピラミッド作りに執着した様子、つまり、1、2、3、2、1の姿は、近づくことさえできなかった.
2回目の試みではy−xと操作回数の関係を見出したが,整数の観点から考慮した問題を誤った範囲に解釈しすぎ,問題に適したモデルが見つからなかった.

だから何の関係なの?


y−xが平方数である場合、動作回数の最大値は2*sqrt(y−x)−1で決定される.
任意の距離Dが与えられると、最小オペランドM(D)は、である.
  • n = a^2 -> 2*-1
  • a^2 < n <= a^2+a -> 2*a
  • a^2+a < n <= (a+1)^2 -> 2*a+1
    様子で決める.
  • パスワードをくれ


    これは私のコードです.
    #include <stdio.h>
    #include <math.h>
    
    int main() {
        unsigned T,x,y,a,d,i=0;
        scanf("%u",&T);
        for(;i<T;i++) {
            scanf("%d%d",&x,&y);
            d=y-x;
            a=(unsigned)floor(sqrt((double)d));
            if(a*a==d) printf("%u\n",2*a-1);
            else if(a*a<d&&d<=a*a+a) printf("%u\n",2*a);
            else if(a*a+a<d<=(a+1)*(a+1)) printf("%u\n",2*a+1);
        }
    }

    他の人はどうやって作ったの?


    一番印象的なのは、床(4*d+1)が効いていることです.掘り出したって
    int main() {
    	long long int a,b,c,d;
    	scanf("%lld", &a);
    	for (long long int i = 0; i < a; i++) {
    		scanf("%lld %lld", &b, &c);
    		d = c - b - 1;
    		printf("%d\n", (int)sqrt(4 * d + 1));
    	}
    }
    tapris解釈
  • https://www.acmicpc.net/source/32175207