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; }