第一题 进制转换
按照正常的方法除,如果余数是负数,把商加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;
}