NOIP2000提高组

第一题 进制转换

按照正常的方法除,如果余数是负数,把商加1,余数加-R。

 

第四题 方格取数

类似NOIP2008提高组第三题《传纸条》。

 

代码

第一题

#include <stdio.h>
int a,r,m,tot,org;
char ans[17],b[1000010];
int main() {
  for (char i = '0';i <= '9';++i)
    ans[i - '0'] = i;
  for (int i = 10;i < 20;++i)
    ans[i] = i + 'A' - 10;
  scanf("%d%d",&a,&r);
  if (a == 0) {
    b[1] = '0';
    tot = 1;
    goto end;
  }
  org = a;
  while (a != 0) {
    m = a % r;
    a /= r;
    if (m < 0) {
      m += -r;
      ++a;
    }
    b[++tot] = ans[m];
  }
  end:
  printf("%d=",org);
  for (int i = tot;i > 0;--i)
    printf("%c",b[i]);
  printf("(base%d)\n",r);
  return 0;
}

第四题

#include <stdio.h>
#define MAXN 11
int xx[2] = {0,-1};
int yy[2] = {-1,0};
int a[MAXN][MAXN],f[MAXN * 3][MAXN][MAXN];
int n,x,y,z;
bool inmap(int x,int y) {
  return (x > 0) && (x <= n) && (y > 0) && (y <= n);
}
int main() {
  scanf("%d",&n);
  while (1) {
    scanf("%d",&x);
    if (!x)
      break;
    scanf("%d%d",&y,&z);
    a[x][y] = z;
  }
  f[2][1][1] = a[1][1];
  for (int k = 3;k <= n * 2;++k)
    for (int i = 1;i <= n;++i)
      for (int j = i;j <= n;++j) {
        int y1 = k - i,y2 = k - j;
        if (inmap(i,y1) && inmap(j,y2))
          for (int l = 0;l < 2;++l) {
            int tx1 = i + xx[l],ty1 = y1 + yy[l];
            if (inmap(tx1,ty1))
              for (int o = 0;o < 2;++o) {
                int tx2 = j + xx[o],ty2 = y2 + yy[o];
                if (inmap(tx2,ty2)) {
                  if ((i != j) && (f[k - 1][tx1][tx2] + a[i][y1] + a[j][y2] > f[k][i][j]))
                    f[k][i][j] = f[k - 1][tx1][tx2] + a[i][y1] + a[j][y2];
                  if ((i == j) && (f[k - 1][tx1][tx2] + a[i][y1] > f[k][i][j]))
                    f[k][i][j] = f[k - 1][tx1][tx2] + a[i][y2];
                }
              }
          }
      }
  printf("%d\n",f[n * 2][n][n]);
  return 0;
}

 

posted @ 2010-11-06 15:40  Sephiroth.L.  阅读(298)  评论(0编辑  收藏  举报