携帯電話料金


10

私の大学コードチャレンジコンテストの許可を得てチャレンジ


私たちが携帯電話に依存しているため、毎晩バッテリーの最大レベルまで充電するので、翌日の途中で電力が不足するリスクはありません。日中に無料のコンセントを見て、何が起こったのかを充電する人もいます。

私もその一人です。

長年にわたって、私は毎晩バッテリーを最大に充電しないように私の技術を磨きました。私の完全に知られている反復的なルーチンにより、それらの部分的な再充電を実行できる時間帯(およびレベルが増加するユニット数)と、各充電の間にバッテリーレベルを低下させる原因は明らかです。これらのデータを使用して、毎晩、自分が課した2ユニットのしきい値を下回らないように、翌日家を出なければならない最小バッテリーレベルを計算します。

私がまだ何とかマスターしていないのは、私が確立されたルーチンを離れたときの同じ計算であり、物事を行うためのいくつかの選択肢があります。たとえば、私が別の方法で到着できる別の都市に行く途中の日に起こります。

問題への最初のアプローチでは、「チェス盤」を左上隅から右下隅に移動したいと想定しています。各「セル」で、携帯電話に特定の金額を充電するか、または充電できず、その負荷レベルが低下します。

チャレンジ

整数のFxC行列を指定して、負荷レベルが2ユニットを下回ることなく、左上隅から右下に移動するために必要な最小バッテリーレベル量を出力します。

マトリックスでは、正の数はパスをたどる前に携帯電話を充電できる量を示し、負の数はコンセントがなく、携帯電話のバッテリーがその量だけ充電レベルを下げていることを示します。ソースセルと宛先セル(左上隅と右下隅)の数量が常に0であり、残りの値(絶対値)が100を超えないことが保証されています。

指定例

[📱111111111111110]

私がより少ないバッテリーを必要とする道は:

[📱111111111111110]

そして、私が必要とする最小のバッテリーレベルの量は4です

ノート

  • スタートは常に左上隅になります
  • 終わりは常に右下隅になります
  • すでに通過したセルには移動できません。例:位置(0,1)になると、最初の点(0,0)に移動できません
  • バッテリーレベルが(何らかの理由で)2未満になることはありません
  • あなたは常に始まりと終わりがあると仮定することができます
  • 必要な場合は、1次元配列を多次元として使用できます [1,2,3] == [[1,2,3]]
  • 複数の正しい(最小限必要な充電)パスが存在する可能性があります
  • あなたの目標は、ルートではなく、必要な最低の初期バッテリーレベルのみを出力することです
  • 垂直方向と水平方向だけに行くことができます(斜めではありません)

テストケース

[0, 0] => 2
[0, 1, 0] => 2
[0, -1, 0] => 3
[0, 15, -20, 5, 0] => 7
[[0, -3],[-5, 0]] => 5
[[0, -5, -9, 5], [-3, 5, 2, -2], [2, -4, -4, 0]] => 5
[[0, -1, 1, -1], [-1, -1, -1, -1], [-1, 1, -1, -1], [1, 1, -1, 0]] => 4

チャレンジの日を忘れました。サンドボックスの投稿
Luis felipe De jesus Munoz

「The Hungry Moose」というチャレンジがサンドボックスから出たことは一度もないので、これは間違いではありません。
ブラックフクロウカイ

@BlackOwlKai両方の課題は異なると思います
Luis felipe De jesus Munoz

1
最適な経路は、左または上に移動する必要がありますか?例[[0,1,-1],[-9,-9,1],[-9,1,-1],[-9,-1,-9],[-9,1,0]]
カミルドラカリ

1
@danaいいえ、0s1つは左上隅に配置され、もう1つは右
下隅に配置されてい

回答:


3

JavaScript(ES7)、 162 156  154バイト

m=>(M=g=(x,y,n,k)=>m.map((r,Y)=>[r[x+1]]+[m[y+1]]?r.map((v,X)=>r[1/v&&(x-X)**2+(y-Y)**2==1&&g(X,Y,u=v+n,k<u?k:u,r[X]=g),X]=v):M=M>k?M:k))(0,0,0)|M<0?2-M:2

オンラインでお試しください!

コメントしました

m => (                          // m[] = input matrix
  M =                           // initialize M to a non-numeric value
  g = (x, y, n, k) =>           // g = recursive depth-first search function
    m.map((r, Y) =>             // for each row r[] at position Y in m[]:
      [r[x + 1]] +              //   if either r[x + 1]
      [m[y + 1]] ?              //   or m[y + 1] is defined:
        r.map((v, X) =>         //     for each value v at position X in r[]:
          r[                    //
            1 / v &&            //       if v is numeric
            (x - X) ** 2 +      //       and the squared Euclidean distance
            (y - Y) ** 2 == 1   //       between (x, y) and (X, Y) is 1:
            &&                  //
              g(                //         do a recursive call:
                X, Y,           //           with (X, Y)
                u = v + n,      //           with n = n + v
                k < u ? k : u,  //           with k = min(k, n + v)
                r[X] = g        //           set r[X] to a non-numeric value
              ),                //         end of recursive call
            X                   //       then restore r[X]
          ] = v                 //       to its initial value
        )                       //     end of inner map()
      :                         //   else (we've reached the bottom right corner):
        M = M > k ? M : k       //     update M to max(M, k)
    )                           // end of outer map()
)(0, 0, 0) |                    // initial call to g with x = y = n = 0 and k undefined
M < 0 ? 2 - M : 2               // return 2 - M if M is negative, or 2 otherwise

3

パイソン2208の 202バイト

lambda s:2-f(s)
def f(s,x=0,y=0):
 if x>-1<y<s[y:]>[]<s[y][x:]!="">s[y][x]:k=s[y][x];s[y][x]="";return k+min(0,max([len(s[y+1:]+s[y][x+1:])and f(eval(`s`),x+a/3-1,y+a%3-1)for a in 7,1,5,3]))
 return-9e9

オンラインでお試しください!


パイソン2217の 211バイト

i=input()
X,Y=len(i[0]),len(i)
s=[[0]*4+[i]];r=[]
for m,l,x,y,g in s:
 if X>x>-1<y<Y<"">g[y][x]:r+=[m]*(Y-y<2>X-x);l+=g[y][x];g[y][x]="";s+=[[min(m,l),l,x+a/3-1,y+a%3-1,eval(`g`)]for a in 7,1,5,3]
print 2-max(r)

オンラインでお試しください!


1

R224の 220 217 213 210バイト

f=function(x,m=rbind(0,cbind(0,x,0),0),i=2,j=2,p=F,k=c(1:-1,0,0,-1:1),b=Inf,`^`=min){m[i,j]=0
for(h in 1:4)b=b^'if'(all(c(R<-i+k[h],C<-j+k[h+4])>dim(x)),max(2,2-cumsum(p)^0),if(v<-m[R,C])b^f(x,m,R,C,c(p,v)))
b}

オンラインでお試しください!


1

C#(Visual C#Interactive Compiler)、242バイト

a=>{int m=1<<31,n=~m;void g(int w,int x,int y,int z){for(int i=4,t,c,d,e;i-->0;)try{t=a[c=i<1?w-1:i<2?w+1:w,d=i>2?x-1:i>1?x+1:x];n=t==0&z<n?z:n;a[c,d]=m;e=y+t<2?2-y-t:0;if(t!=m)g(c,d,y+t+e,z+e);a[c,d]=t;}catch{}}a[0,0]=m;g(0,0,2,2);return n;}

オンラインでお試しください!

//a: input matrix
a=>{
  // m: marker for used cells
  // n: result, initialized to a huge value
  int m=1<<31,n=~m;
  // recursive function
  // w: 1st dim coordinate
  // x: 2nd dim coordinate
  // y: current charge level
  // z: initial charge for current path
  void g(int w,int x,int y,int z){
    // i: loop variable
    // t: temp holds overwritten value
    // c: adjacent 1st dim coordinate
    // d: adjacent 2nd dim coordinate
    // e: delta charge needed
    for(int i=4,t,c,d,e;i-->0;)
      // avoid index out of range errors
      // by using try/catch
      try{
        // determine neighbor
        // coordinates and save value
        t=a[c=i<1?w-1:i<2?w+1:w,
            d=i>2?x-1:i>1?x+1:x];
        // if we have found a 0, check if
        // initial charge is lower than the
        // lowest so far. save it if it is.
        n=t==0&z<n?z:n;
        // mark current cell used
        a[c,d]=m;
        // determine if we need to
        // increase the initial charge
        e=y+t<2?2-y-t:0;
        // make recursive call if current
        // cell was not previously in use
        if(t!=m)g(c,d,y+t+e,z+e);
        // restore current cell value
        a[c,d]=t;
      }catch{}
  }
  // mark starting cell used
  a[0,0]=m;
  // start the recursive function
  g(0,0,2,2);
  // return the result to the caller
  return n;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.