hdu2050 折线分割平面

摘要: 题解: 图的线面关系,若有n条直线,最多(每条直线都不过交点)能将平面分割成1+1+2+3+4+5+6+7+8+9+10+11+12+...+n=(n^2+n)/2+1部分。将折线看成直线,n条折线相当于2n条直线,构成2*n^2 + n + 1个面。将n交点处多出的2*n个面减去就是n条折线分割平面最多部分。代码如下:#include <stdio.h> int main() { int n, m; scanf("%d", &m); while (m--) { scanf("%d", &n); printf("%d 阅读全文
posted @ 2013-01-23 21:40 zm001 阅读(130) 评论(0) 推荐(0) 编辑

hdu 2057 A + B again

摘要: 题解: 乍一看以为是个模拟题,但是仔细看了一下题意,才发现最大数字是15位,没有超过 __int64 能表达的最大数。__int64 最大能表示16位十六进制数。所以直接进行加减就行了,需要注意的是输入输出的格式以及十六进制表达负数的时候显示的是补码。代码如下:#include <stdio.h> int main() { __int64 n, m, tmp; while (scanf("%I64X %I64X", &n, &m) != EOF) { tmp = m + n; if (tmp >= 0) printf("%I64X 阅读全文
posted @ 2013-01-23 09:22 zm001 阅读(127) 评论(0) 推荐(0) 编辑

hdu 2053 Swith Game

摘要: 题解: 简单模拟题,但是该题穷举的话太浪费时间和空间了。由给出的例子, Consider the second test case: The initial condition : 0 0 0 0 0 … After the first operation : 1 1 1 1 1 … After the second operation : 1 0 1 0 1 … After the third operation : 1 0 0 0 1 … After the fourth operation : 1 0 0 1 1 … After the fifth operation ... 阅读全文
posted @ 2013-01-21 15:07 zm001 阅读(154) 评论(0) 推荐(0) 编辑

hdu 2052 picture

摘要: 题解: 简单模拟题,不解释。代码如下:#include <stdio.h> void print1(int n) { int i; printf("+"); for (i=0; i<n; i++) printf("-"); printf("+\n"); } void print2(int n) { int i; printf("|"); for (i=0; i<n; i++) printf(" "); printf("|\n"); } int main 阅读全文
posted @ 2013-01-21 11:30 zm001 阅读(107) 评论(0) 推荐(0) 编辑

hdu2051 bitset

摘要: 题解: 简单数制转换,递归实现,不解释。代码如下:#include <stdio.h> void func(int n) { if (n == 0) return; if (n % 2 == 1) { func(n/2); printf("1"); } else { func(n/2); printf("0"); } } int main() { int n; while (scanf("%d", &n) != EOF) { func(n); printf("\n"); } return 0; 阅读全文
posted @ 2013-01-21 11:09 zm001 阅读(170) 评论(0) 推荐(0) 编辑

hdu 2049 考新郎

摘要: 题解: 此题属于递推题,和hdu2048思路是一样的,不同的是先将不用跪搓板的新郎挑出,有B = n! / ((n-m)! * m!)个,再将跪搓板的新郎A = A[m](这与hdu2048算法一样)个。总的个数为A*B个。同样要记得用 __int64 开数组A[], B[]。 代码如下:#include <stdio.h> __int64 fact(int n) { if (n <= 1) return 1; else return n*fact(n-1); } int main() { int i, n, m, C; __int64 A[21] = {0, 0, 1},. 阅读全文
posted @ 2013-01-21 10:35 zm001 阅读(167) 评论(0) 推荐(0) 编辑

hdu2046 骨牌铺方格

摘要: 题解:代码如下:#include <stdio.h>__int64 A[51][30], B[51];int main(){ int n, i, j; for (i=0; i<=50; i++) A[i][0] = 1; for (i=2; i<=50; i++) { for (j=1; j<i/2+1; j++) A[i][j] = A[i-2][j-1] + A[i-1][j]; } for (i=1; i<=50; i++) { for (j=0; j<30; j++) B[i] += A[i][j]; } while (scanf(" 阅读全文
posted @ 2013-01-20 21:41 zm001 阅读(124) 评论(0) 推荐(0) 编辑

hdu 2045 LELE的EPG难题

摘要: 题解: 简单递推题,如图:从A4开始,分两类讨论:1、A4的第3个与A4的第1个颜色相同 2、第3个与第1个颜色不相同。第1类情况A4相当于A2*2,这里的2相当于外加另外两种颜色中的一种;第2类情况A4相当于A3,因为首尾颜色不相同,第1个与第3个颜色不同,那么第4个只有1种颜色可以选择。依次类推,可得余下的数据。因为有50个方框,得用long long int 能存储。 需要注意的是while (scanf("%d", &n) != EOF)不能写成while (scanf("%d", &n)),因为后者可能导致无限循环。代码如下:# 阅读全文
posted @ 2013-01-20 16:29 zm001 阅读(136) 评论(0) 推荐(0) 编辑

hdu 2048 神、上帝以及老天爷

摘要: 题解: 本题主要思路是,算出i个人的总选择数a和以悲剧结尾的总选择数b,然后b/a,完成。属于递推题:图中横杠代表人,竖杠代表签名。Ai代表i个人共有A[i]个选择,Bi起过度作用。因为最多有20人,可将这20个数据存储到数组中以备调用。 这样很容易得到递推式:B[i] = A[i-2] + (n-2) * B[i-1], A[i] = (i-1) * B[i];代码如下:#include <stdio.h> __int64 fact(int n) { __int64 ft = n; while (--n) { ft *= n; } return ft; } int main... 阅读全文
posted @ 2013-01-20 14:27 zm001 阅读(195) 评论(0) 推荐(0) 编辑

hdu 2037 今年暑假不AC

摘要: 题解:贪心法 选择不相交区间 先将所有的电视节目按照结束时间的早晚排序,排好序后,第一个节目是必须选的,因为他结束时间最早,最不可能与其他节目重叠。将该节目和与它重叠的节目删除(这样写是为了好理解,写程序是可以不删除),那么剩下的节目的第一个节目就成了必选节目,再删除,再选......一直到没有节目为止,就可得到正解。 代码如下:#include <cstdio> #include <algorithm> typedef struct TV { int Ti_s, Ti_e; bool operator <(const TV & x)const {//为了 阅读全文
posted @ 2013-01-19 21:15 zm001 阅读(143) 评论(0) 推荐(0) 编辑