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;

}


 

你可能感兴趣的:(IP)