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

 

posted @ 2010-08-14 18:00  孟起  阅读(422)  评论(0编辑  收藏  举报