読者です 読者をやめる 読者になる 読者になる

Tamflexの貯蔵庫

やる気のない備忘録

codeIQ 2751

contest contest-codeIQ


図形に関して, 3*7の長方形を3個つなげた対称性の高い空間だと言える.
これらの長方形をそれぞれworld 0,1,2として範囲外に出たら「奈落」/「ワープ」させる条件分岐を書けばわかりやすいかもしれない.
文字の変換についてだが, こちらもASCIIコードを駆使してあげれば綺麗に書ける.
あとは数値を'F'*数値に置き換えてfor文を回せばあとはやるだけ.

char conv(int w, int i)
{
  switch (w) {
    case 0:
      if(i<10) return '0'+i;
      else return 'a'+i-10;
    case 1:
      if(i<15) return 'l'+i;
      else return 'A'+i-15;
    case 2:
      if(i<20) return 'G'+i;
      else return '@';
    default :
      return ' ';
  }
}

int main()
{
  string s, t=""; cin >> s;
  string str = "";
  int dx[] = {1,0,-1,0,0};
  int dy[] = {0,1,0,-1,0};
  int x=0, y=0, d=0, w=0;
  REP(i,s.size())
  {
    switch(s[i])
    {
      case 'R':
        t += s[i];
        break;
      case 'L':
        t += s[i];
        break;
      default :
        REP(j,s[i]-'0') t += 'F';
        break;
    }
  }
  t += "F";
  REP(i,t.size())
  {
    if(x<0||x>6||y<0||y>2)
    {
      if(y==3&&x>=0&&x<=2)
      {
        y = x;
        x = 6;
        w = (w+2)%3;
        d = 2;
      }
      else if(x==7&&y>=0&&y<=2)
      {
        x = y;
        y = 2;
        w = (w+1)%3;
        d = 3;
      }
      else
      {
        str += "!";
        break;
      }
    }
    switch (t[i])
    {
      case 'R':
        d = (d+1)%4;
        break;
      case 'L':
        d = (d+3)%4;
        break;
      case 'F':
        str += conv(w,x*3+y);
        x += dx[d];
        y += dy[d];
        break;
      default :
        break;
    }
  }
  cout << str << endl;
}

codeIQ 2767

contest contest-codeIQ language language-c++11

説明が不十分だと思うのだけど, 同じ類似度の時にインデックスの小さい方を先に出さないとtest case2で落ちる.

int tn;
vector<int> ns;
vector<int> tmp;

int norm(vector<int> v)
{
  int ans = 0;
  int until = v.size()-1;
  FOR(i,1,until) ans+=v[i]*v[i];
  return ans;
}

int dot(vector<int> u, vector<int> v)
{
  int ans = 0;
  int until = min(u.size(),v.size())-1;
  FOR(i,1,until) ans += u[i]*v[i];
  return ans*ans;
}

bool cmp(vector<int> u, vector<int> v)
{
  int un = dot(u,tmp);
  int ud = tn*ns[u[0]];
  int vn = dot(v,tmp);
  int vd = tn*ns[v[0]];
  double a = 1.0*un/ud;
  double b = 1.0*vn/vd;
  return (un*vd==vn*ud)?u[0]<v[0]:a>b;
}

void solve(vector<vector<int>> T,int id)
{
  tmp = T[id];
  tn = ns[id];
  sort(T.begin()+1,T.end(),cmp);
  printf("%d ",id);
  FOR(i,2,4) printf("%d%s",T[i][0],i==4?"\n":" ");
}

int main()
{
  int nu, ni, n; scanf("%d %d %d",&nu, &ni, &n);
  vector<vector<int> > T(ni+1,vector<int>(nu+1,0));
  FOR(i,1,ni) T[i][0] = i;
  REP(i,n)
  {
    int item, user, rate;
    scanf("%d %d %d",&user, &item, &rate);
    T[item][user] = rate;
  }
  //FOR(i,1,ni){ FOR(j,1,nu) cout << T[i][j]; cout << endl;}
  ns.resize(ni+1);
  FOR(i,1,ni) ns[i] = norm(T[i]);
  int m; scanf("%d",&m);
  REP(i,m)
  {
    int item; scanf("%d",&item);
    solve(T,item);
  }
  return 0;
}

codeIQ 1678

contest contest-codeIQ language language-ruby


count{|a|...}はブロックの返り値でtrueとなるもののみをcountする.

b,e=gets.split(',').map(&:to_i);$><<[*b+1..e-1].count{|a|a.to_s(2).reverse==a.to_s(2)}

codeIQ 1630

contest contest-codeIQ language language-c++


abc029にも似た, というかほぼ同じな問題があった.

念の為long long intを用いて解いた.

void solve(ll n)
{
  n++; ll d = 1, t, ans = 0;
  while(n>d)
  {
    t = d;
    d *= 10;
    ans += (n/d)*t+(n%d>t*7?(n%d>=t*8?t:(n%d)%t):0);
  }
  cout << ans << "\n";
}

int main()
{
  ll n;
  while(cin >> n) solve(n);
  return 0;
}

codeIQ 1621

contest contest-codeIQ language language-c++

なんとなくlower_boundでやりたかった.

vector<ll> p;

void init()
{
  p.resize(10000);
  fill(p.begin(),p.end(),1LL<<30);
  int m = 0; p[m++] = 2;
  for(int i=3;i<=100000;i+=2)
  {
    bool flag = true;
    for(int j=0;p[j]*p[j]<=i;j++)
    {
      if(i%p[j]==0)
      {
        flag = false;
        break;
      }
    }
    if(flag) p[m++] = i;
  }
}

void solve()
{
  init();
  int d;
  while(cin >> d)
  {
    int ans = lower_bound(p.begin(),p.end(),d)-p.begin();
    printf("%d\n",ans);
  }
}

int main()
{
  solve();
  return 0;
}