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