比赛地址:
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)=xC(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
转载于:https://www.cnblogs.com/DreamUp/archive/2010/08/14/1799692.html
