比赛地址:
http://acm.hdu.edu.cn/diy/contest_show.php?cid=7323
密码:zzuliacm
1001 –HDU1715
大整数相加
1002 –HDU1426
DFS
和HDU2553 N皇后问题一个道理
#include < stdio.h >
struct Point{
int x,y;
}p[ 81 ];
int map[ 10 ][ 10 ],ans[ 10 ][ 10 ];
int dir[ 4 ][ 2 ] = {{ 1 , 0 },{ - 1 , 0 },{ 0 , 1 },{ 0 , - 1 }};
int flag,num;
int ok( int q, int k)
{
int i,j,si,sj;
for (i = 0 ;i < 9 ;i ++ )
if (map[p[q].x][i] == k && i != p[q].y)
return 0 ;
for (i = 0 ;i < 9 ;i ++ )
if (map[i][p[q].y] == k && i != p[q].x)
return 0 ;
si = p[q].x / 3 * 3 ;
sj = p[q].y / 3 * 3 ;
for (i = 0 ;i < 3 ;i ++ )
for (j = 0 ;j < 3 ;j ++ )
{
if ((si + i) == p[q].x && (sj + j) == p[q].y) continue ;
if (map[si + i][sj + j] == k) return 0 ;
}
return 1 ;
}
void dfs( int q)
{
int i,j;
if (q == num)
{
for (i = 0 ;i < 9 ;i ++ )
for (j = 0 ;j < 9 ;j ++ )
ans[i][j] = map[i][j];
flag = 1 ;
return ;
}
for (i = 1 ;i <= 9 ;i ++ )
if (ok(q,i) && flag == 0 )
{
map[p[q].x][p[q].y] = i;
dfs(q + 1 );
map[p[q].x][p[q].y] = 0 ;
}
return ;
}
int main()
{
int T = 0 ,i,j;
char s[ 3 ];
while (scanf( " %s " ,s) != EOF)
{
num = 0 ;
if (s[ 0 ] == ' ? ' )
p[num].x = 0 , p[num ++ ].y = 0 , map[ 0 ][ 0 ] = 0 ;
else
map[ 0 ][ 0 ] = s[ 0 ] - ' 0 ' ;
for (i = 0 ;i < 9 ;i ++ )
for (j = 0 ;j < 9 ;j ++ )
{
if (i == 0 && j == 0 ) continue ;
scanf( " %s " ,s);
if (s[ 0 ] == ' ? ' )
p[num].x = i, p[num ++ ].y = j, map[i][j] = 0 ;
else
map[i][j] = s[ 0 ] - ' 0 ' ;
}
flag = 0 ;
dfs( 0 );
if (T ++ ) puts( "" );
for (i = 0 ;i < 9 ;i ++ )
{
for (j = 0 ;j < 8 ;j ++ )
printf( " %d " ,ans[i][j]);
printf( " %d\n " ,ans[i][ 8 ]);
}
}
return 0 ;
}
1003 –HDU2200
简单数学题
这道题可以看做从n个中选出2、3...n个人,然后选2个人有1种分发,3个人有2种分发...n个人有n-1种分发
注:这里说的3个人有2种分发只是1|23和12|3两种,以此类推
那么任意选出两个人有C(n,2)种,选3个人有C(n,3)种...;
那么n个人的答案就是C(n,2)*1+C(n,3)*2+...C(n,n)*(n-1);
#include < stdio.h >
__int64 f[ 100 ][ 100 ],n,m,i;
__int64 work(__int64 n,__int64 m) // f[n][ m ]的值即数学中的C(n,m);
{
if (f[n][ m])
return f[n][ m];
if (n == m || m == 0 )
return 1 ;
return f[n][ m] = work(n - 1 ,m) + work(n - 1 ,m - 1 ); // n人中任意选m个可能是第n个人没被选中和被选中,
// 没选中就是n-1个人里选m个,选中了就是n-1个人里选m-1个
}
int main()
{
// freopen("in.dat","r",stdin);
// freopen("out.dat","w",stdout);
while (scanf( " %I64d " , & n) != EOF)
{
m = 0 ;
for (i = 2 ;i <= n;i ++ )
m += work(n,i) * (i - 1 );
printf( " %I64d\n " ,m);
}
return 0 ;
}
利用kC(n,k)=nC(n-1,k-1)公式
设C(n,2)*1+C(n,3)*2+...+C(n,n)*(n-1)=x
C(n,2)*1+C(n,3)*2+...+C(n,n)*(n-1)+C(n,1)*1+C(n,2)+...+C(n,n)
=C(n,1)+C(n,2)*2+C(n,3)*3+...+C(n,n)*n
=[C(n-1,0)+C(n-1,1)+C(n-1,2)+...+C(n-1,n-1)]*n
=n*2^(n-1)
由于x+2^n-1=n*2^(n-1) 所以x=n*2^(n-1)-2^n+1=(n-2)*2^(n-1)+1
#include < stdio.h >
int main()
{
__int64 n,i,a[ 66 ];
a[ 1 ] = 2 ;
for (i = 2 ;i < 64 ;i ++ )
a[i] = a[i - 1 ] * 2 ;
while (scanf( " %I64d " , & n) != EOF)
printf( " %I64d\n " ,(n - 2 ) * a[n - 1 ] + 1 );
return 0 ;
}
1004 –HDU2571
DP
1005 –HDU1032
3n+1问题是一个经典问题,但这题很简单的,你A了吗?
1006 –HDU3378
模拟题
这题可不是很好实现啊,superbin’s blog发表了本题的结题报告
http://www.cnblogs.com/superbin/archive/2010/04/04/1704353.html
1007 –HDU2217
枚举
http://zc634579757.blog.163.com/blog/static/124497462200991493534615/
1008 –HDU2602
0-1背包
加油啊,每个人都要掌握住的基本背包问题。
附上一组数据
1
2 0
20 1
0 1
输出20