ZZULI-Summer Training Contest(Seven)解题报告

 

比赛地址:

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

 

你可能感兴趣的:(test)