제출 #880091

#제출 시각아이디문제언어결과실행 시간메모리
880091SzypkiBill죄수들의 도전 (IOI22_prison)C++17
0 / 100
1 ms348 KiB
#include "prison.h" 
#include <vector>
int cyfra(int pozycja, int liczba){
    liczba++;
    if(pozycja>8) return 0;
    //return 1;
    int c = 0;
    int p = 2187;
    for(int i=1; i<=pozycja; i++){
        c=0;

        while(liczba>p){
            liczba-=p;
            c++;
        }
        p/=3;
    }
    return c;
}
int transform(int j){
    return j;
    if(j<=8) return j;
    if(j<=18) return j-2;
    return j-4;
}

std::vector<std::vector<int>> devise_strategy(int N) {
    int X = 28;
    int Y = 25;
  //return {std::vector<int>(N + 1, 0)};
  std::vector<std::vector<int>> V(Y+1);
  int c = 0;
  for(auto &w : V){w.resize(N+1); w[0] = c; c+=1; c%=2;}
  for(int j=1; j<=N; j++){
    V[0][j] = cyfra(1,j) * 10 + 1;
  }

  for(int i=1; i<=X; i++){
      if(i%10 == 9 || i%10 == 0) continue;
    for(int j=1; j<=N; j++){
        if(V[transform(i)][0]){ //sprawdzam worek B, mam A
            int aktB = cyfra(i%10,j); // cyfra z B
            int aktA = i/10; // cyfra z A
            if(aktB == aktA){
                V[transform(i)][j] = cyfra((i%10)+1,j) * 10 + ((i%10)+1);
            }else if(aktB<aktA) V[transform(i)][j] = -2;
            else if(aktA<aktB) V[transform(i)][j] = -1;

        }else{ //sprawdzam worek A, mam B

            int aktA = cyfra(i%10,j); // cyfra z A
            int aktB = i/10; // cyfra z B
            if(aktB == aktA){
                V[transform(i)][j] = cyfra((i%10)+1,j) * 10 + ((i%10)+1);
            }else if(aktB<aktA) V[transform(i)][j] = -2;
            else if(aktA<aktB) V[transform(i)][j] = -1;
        }
    }
  }
  return V;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...