1451
int main()
{
int i, j, n;
long long f[21];
while(scanf("%d", &n) != EOF)
{
f[0] = 1;
f[1] = 0;
for (i=2; i<=n; i++)
{
f[i] = (i-1)*(f[i-1]+f[i-2]);
//f[i] = 0;
//for (j=0; j<=i-2; j++)
// f[i] = (j+1)*(f[i]+f[j]);
}
printf("%lld\n", f[n]);
}
return 0;
}
/**************************************************************
Problem: 1451
User: liangrx06
Language: C
Result: Accepted
Time:0 ms
Memory:912 kb
****************************************************************/
1452
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 2000
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int main()
{
int i, j;
int n, k, w[N+1];
int dp[2][N+1];
while (scanf("%d%d", &n, &k) != EOF)
{
for (i=1; i<=n; i++)
scanf("%d", &w[i]);
qsort(w+1, n, sizeof(w[0]), cmp);
memset(dp[0], 0, sizeof(dp));
for (i=1; i<=k; i++)
{
for (j=2*i; j<=n-2*(k-i); j++)
{
dp[i&1][j] = dp[(i-1)&1][j-2] + (w[j]-w[j-1])*(w[j]-w[j-1]);
if (j > 2*i && dp[i&1][j-1] < dp[i&1][j])
dp[i&1][j] = dp[i&1][j-1];
}
}
printf("%d\n", dp[k&1][n]);
}
return 0;
}
1453
//dp二维数组内存消耗较大,如下方法可以大大降低内存使用
int main()
{
int i, j, k, n, t;
int x, y;
int w;
int zero;
int dp[2][2*M+1];
scanf("%d", &t);
for (k=1; k<=t; k++)
{
scanf("%d", &n);
for (j=-M; j<=M; j++)
dp[0][j+OFF] = -INF;
dp[0][0+OFF] = 0;
zero = 0;
for (i=1; i<=n; i++)
{
scanf("%d", &w);
if (w == 0)
zero = 1;
for (j=-M; j<=M; j++)
{
dp[i&1][j+OFF] = dp[(i-1)&1][j+OFF];
if (j-w >= -M)
{
x = (dp[(i-1)&1][j-w+OFF] + (j-w))/2;
y = (dp[(i-1)&1][j-w+OFF] - (j-w))/2;
if (x >= 0 && x <= M && y >= 0 && y <= M)
{
dp[i&1][j+OFF] = (dp[(i-1)&1][j-w+OFF]+w > dp[i&1][j+OFF]) ?
(dp[(i-1)&1][j-w+OFF]+w) : dp[i&1][j+OFF];
}
}
if (j+w <= M)
{
x = (dp[(i-1)&1][j+w+OFF] + (j+w))/2;
y = (dp[(i-1)&1][j+w+OFF] - (j+w))/2;
if (x >= 0 && x <= M && y >= 0 && y <= M)
{
dp[i&1][j+OFF] = (dp[(i-1)&1][j+w+OFF]+w > dp[i&1][j+OFF]) ?
(dp[(i-1)&1][j+w+OFF]+w) : dp[i&1][j+OFF];
}
}
}
}
printf("Case %d: ", k);
if (dp[n&1][0+OFF] <= 0)
{
dp[n&1][0+OFF] = (zero == 1) ? 0 : -1;
printf("%d\n", dp[n&1][0+OFF]);
}
else
printf("%d\n", dp[n&1][0+OFF]/2);
}
return 0;
}
/**************************************************************
Problem: 1453
User: liangrx06
Language: C
Result: Accepted
Time:30 ms
Memory:912 kb
****************************************************************/
1454
#include <stdio.h>
#include <stdlib.h>
#define N 500
#define M 10000
#define INF (1e8)
typedef struct node {
int w;
int v;
} Coin;
int main()
{
int i, j, n, t;
int e, f;
Coin c[N];
int dp[M+1];
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &e, &f);
scanf("%d", &n);
dp[e] = 0;
for (j=e+1; j<=f; j++)
dp[j] = INF;
for (i=0; i<n; i++)
{
scanf("%d%d", &c[i].v, &c[i].w);
for (j=e+c[i].w; j<=f; j++)
{
int tmp = dp[j-c[i].w] + c[i].v;
dp[j] = (tmp < dp[j]) ? tmp : dp[j];
}
}
if (dp[f] == INF)
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n", dp[f]);
}
return 0;
}
1455
#include <stdio.h>
#include <string.h>
#define N 100
#define M 100
typedef struct node {
int p;
int h;
int c;
} Food;
int main(void)
{
int t, n, m, i, j, k;
Food f[M];
int dp[N+1];
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
for (i=0; i<m; i++)
scanf("%d%d%d", &f[i].p, &f[i].h, &f[i].c);
memset(dp, 0, sizeof(dp));
for (i=0; i<m; i++)
{
for (j=0; j<f[i].c; j++)
{
for (k=n; k>=f[i].p; k--)
{
int tmp = dp[k-f[i].p] + f[i].h;
dp[k] = (tmp > dp[k]) ? tmp : dp[k];
}
}
}
printf("%d\n", dp[n]);
}
return 0;
}
1456
typedef struct node {
int x;
int y;
int z;
int s;
int v;
int d;
} Point;
int a, b, c;
int tmax;
Point p[N][N][N];
Point *queue[N*N*N+1];
int front, rear;
void initQueue()
{
front = rear = 0;
}
int isEmpty()
{
return front == rear;
}
void push(Point *p1)
{
queue[rear++] = p1;
}
Point *pop()
{
return queue[front++];
}
void init()
{
int i, j, k;
initQueue();
for (i=0; i<a; i++)
{
for (j=0; j<b; j++)
{
for (k=0; k<c; k++)
{
scanf("%d", &(p[i][j][k].s));
p[i][j][k].x = i;
p[i][j][k].y = j;
p[i][j][k].z = k;
p[i][j][k].d = INF;
p[i][j][k].v = p[i][j][k].s;
}
}
}
}
void printDistance()
{
printf("=====\n");
for (int i=0; i<a; i++)
{
for (int j=0; j<b; j++)
{
for (int k=0; k<c; k++)
printf("%d ", p[i][j][k].d);
printf("\n");
}
}
}
int legal(int x, int y, int z)
{
return x>=0 && x<a && y>=0 && y<b
&& z>=0 && z<c && (p[x][y][z].s != 1);
}
void BFS(Point *begin, Point *end)
{
int i;
begin->v = 1;
begin->d = 0;
push(begin);
int t[6][3] = {{0, 0, 1}, {0, 1, 0}, {1, 0, 0}, {0, 0, -1}, {0, -1, 0}, {-1, 0, 0}};
while (!isEmpty())
{
Point *p1 = pop();
for (i=0; i<6; i++)
{
int nx = p1->x + t[i][0];
int ny = p1->y + t[i][1];
int nz = p1->z + t[i][2];
if (legal(nx, ny, nz) && !p[nx][ny][nz].v)
{ // 此处两个判断的顺序写反了,结果一直runtime error,切记小心!!!
Point *np = &p[nx][ny][nz];
np->v = 1;
np->d = p1->d + 1;
if (np->d > tmax || np == end)
return ;
push(np);
}
}
}
}
int main()
{
int n;
Point *begin, *end;
scanf("%d", &n);
while (n--)
{
scanf("%d%d%d%d", &a, &b, &c, &tmax);
init();
begin = &p[0][0][0];
end = &p[a-1][b-1][c-1];
if ( begin->s == 1 || end->s == 1 || a+b+c-3 > tmax)
{
printf("-1\n");
continue;
}
BFS(begin, end);
if (end->d > tmax)
printf("-1\n");
else
printf("%d\n", end->d);
}
return 0;
}
/**************************************************************
Problem: 1456
User: liangrx06
Language: C
Result: Accepted
Time:30 ms
Memory:5064 kb
****************************************************************/
1457
int main()
{
int S, N, M, s, n, m, count;
while(scanf("%d%d%d", &S, &N, &M) != EOF)
{
if (S == 0)
break;
if (N < M)
{
int tmp = N;
N = M;
M = tmp;
}
s = S-N;
n = N;
m = 0;
count = 1;
while (s != S)
{
if (!n)
{
s -= N;
n = N;
count ++;
}
else if (m < M)
{
if (n + m >= M)
{
n -= M-m;
m = M;
}
else
{
m += n;
n = 0;
}
count ++;
}
if (m == M)
{
s += m;
m = 0;
count ++;
if (s == n)
break;
}
//if (count <= 20)
// printf("%d %d %d\n", s, n, m);
}
if (s == S)
printf("NO\n");
else
printf("%d\n", count);
}
return 0;
}
/**************************************************************
Problem: 1457
User: liangrx06
Language: C
Result: Accepted
Time:0 ms
Memory:912 kb
****************************************************************/
1458
int main()
{
int i,n;
long long a[36];
while(scanf("%d", &n) != EOF)
{
a[1] = 2;
for (i=2; i<=n; i++)
a[i] = 3*a[i-1] + 2;
printf("%lld\n", a[n]);
}
return 0;
}
/**************************************************************
Problem: 1458
User: liangrx06
Language: C
Result: Accepted
Time:0 ms
Memory:912 kb
****************************************************************/
1459
#include <stdio.h>
#include <math.h>
#include <string.h>
int isPrime(int n)
{
for (int i=2; i<=sqrt(n); i++)
{
if (n%i == 0)
return 0;
}
return 1;
}
int p[40];
void initPrime()
{
int i;
p[1] = 0;
for (i=2; i<32; i++)
{
if (isPrime(i))
p[i] = 1;
else
p[i] = 0;
}
}
void printPrime()
{
int i, j;
for (i=1; i<=39; i++)
printf("%d ", p[i]);
printf("\n");
}
int b[17][17];
void initBeside()
{
int i, j;
for (i=1; i<17; i++)
{
b[i][0] = 0;
for (j=1; j<17; j++)
{
if (j!=i && p[i+j])
b[i][++b[i][0]] = j;
}
}
}
void printBeside()
{
int i, j;
for (i=1; i<=6; i++)
{
int tmp = b[i][0];
for (j=1; j<=tmp; j++)
printf("%d ", b[i][j]);
printf("\n");
}
}
int n;
int v[17];
int num[17];
void initSet()
{
memset(v, 0, sizeof(v));
v[1] = 1;
num[1] = 1;
}
void printCircle()
{
int i;
for (i=1; i<n; i++)
printf("%d ", num[i]);
printf("%d\n", num[i]);
}
void set(int k)
{
if (k == n)
{
if (p[num[n]+num[1]])
printCircle();
return;
}
int i;
int x = num[k];
int count = b[x][0];
for (i=1; i<=count; i++)
{
int tmp = b[x][i];
if (tmp > n)
break;
if (!v[tmp])
{
num[k+1] = tmp;
v[tmp] = 1;
set(k+1);
v[tmp] = 0;
}
}
}
int main(void)
{
int i;
initPrime();
initBeside();
int count = 0;
while (scanf("%d", &n) != EOF)
{
printf("Case %d:\n", ++count);
initSet();
set(1);
printf("\n");
}
return 0;
}
1460
char maze[N+1][N+1];
char mark[N+1][N+1];
int n, m;
int go[8][2] = {
{1, 0},
{-1, 0},
{0, 1},
{0, -1},
{1, 1},
{1, -1},
{-1, -1},
{-1, 1},
};
void DFS(int x, int y){
int i = 0;
for (i = 0; i < 8; i++){ int nx = x + go[i][0]; int ny = y + go[i][1]; if (nx < 1 || nx > n || ny < 1 || ny > m){
continue;
}
if (maze[nx][ny] == '*'){
continue;
}
if (mark[nx][ny] == 1){
continue;
}
mark[nx][ny] = 1;
DFS(nx, ny);
}
return;
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF){
if (n ==0 && m == 0){
break;
}
int i = 0, j = 0;
for (i = 1; i <= n; i++){ scanf("%s", maze[i] + 1); } for (i = 1; i <= n; i++){ for (j = 1; j <= m; j++){ mark[i][j] = 0; } } int ans = 0; for (i = 1; i <= n; i++){ for (j = 1; j <= m; j++){ if (mark[i][j] == 1){ continue; } if (maze[i][j] == '*'){ continue; } DFS(i, j); ans++; } } printf("%d\n", ans); } return 0; } /************************************************************** Problem: 1460 User: liangrx06 Language: C Result: Accepted Time:10 ms Memory:932 kb ****************************************************************/