HDU
风大了猪依旧飞不起来
这个作者很懒,什么都没留下…
展开
-
HDU 2055 An easy problem(关于这道题中的一些小问题希望大家了解)
题目就不说了。并不是要说这个题,只是希望通过这个题来讲讲里面的一些小内容scanf与getchar这两个是很相似但又不相同的。scanf("%c")遇到空格或者换行或\tab就认为读取结束(它并不会读取换行);%c的字符输入格式会接收回车字符,在输入第一个scanf时输入字符后按回车结束,输入缓冲中保存了这个回车符。这也就为后面有些问题的原因getchar会读取原创 2017-10-20 13:49:16 · 650 阅读 · 0 评论 -
HDU 1019 Least Common Multiple(三个注意的点)
1.优美的最大公约数的算法int gcd(int a, int b) { return b?gcd(b, a%b):a;}2.溢出问题两个数是a,b最大公约数是p,最小公倍数是q那么有这样的关系:ab=pq所以q=ab/p,于是很多同学 a * b / p,这里a * b可能会溢出。只要改一下运算顺序就对了, a / p * b;3.依次处理类原创 2017-11-24 12:05:56 · 389 阅读 · 0 评论 -
HDU 1018 Big Number(阶乘位数计算)
整数n的位数的计算方法为:log10(n)+1故n!的位数为log10(n!)+1 如果仅仅是求阶乘的位数,用斯特林(Stirling)公式求解斯特林(Stirling)公式:n!的位数就是求log10((2*PI*n)^1/2*(n/e)^n)+1即 1/2*log10(2*PI*n)+n*log10(n/e)+1这题解决后可以尝试1042 n!原创 2017-11-24 13:43:17 · 273 阅读 · 0 评论 -
HDU 1008 Elevator(最简代码)
每个数据之间的连续处理一般不需要数组,没那个必要。第一次多读取一个值,然后依次往后处理即可n个数据就要停n层,初始为sum = n * 5 + 6 * m;此时已在第一个数据的楼层,两个楼层差值为负加楼层之差乘4,否则乘6,每次将楼层置为当前楼层,依次与后面的进行处理#includeint main(void){ int n, m, sum, k; while (sca原创 2017-11-25 10:17:59 · 277 阅读 · 0 评论 -
HDU 1012 u Calculate e(两种方法)
水题打表,好题实操1.打表#includeint main(void){ printf("n e\n- -----------\n0 1\n"); printf("1 2\n2 2.5\n3 2.666666667\n4 2.708333333\n"); printf("5 2.716666667\n6 2.718055556\n7 2.718253968\n")原创 2017-11-25 11:36:29 · 365 阅读 · 0 评论 -
HDU 2602 Bone Collector(01背包问题)
如果直接搜索,会浪费大量时间搜索已知的结果,造成超时。可以用记忆化数组记录已经搜索过的结果,在查询已知的结果时,直接返回即可如果你不知道为什么错了,那么...........请注意是先输入价值,后输入容量利用dp可以更好的处理,提升效率#include#includeint N, V;int weight[1005], value[1005];原创 2017-12-21 21:18:19 · 212 阅读 · 0 评论 -
HDU 1159 Common Subsequence(LCS)
当s1[s]=s2[t]时,在公共子串末尾加上s1[s]当s1[s]!=s2[t]时,s1当前长度减1与s2比;s2当前长度减1与s1比if (s1[s] == s2[t]) { dp[s+1][t+1] = dp[s][t] + 1; } else { dp[s+1][t+1] = max(dp[s]原创 2017-12-22 20:53:16 · 189 阅读 · 0 评论 -
HDU 1312 Red and Black(dfs)
只dfs上下左右即可#include#includechar maze[25][25];int ans, n, m;void dfs(int i, int j) { maze[i][j] = '#'; for (int s = -1; s <= 1; s++) { for (int t = -1; t <= 1; t++) { if (abs(原创 2017-12-23 19:00:05 · 187 阅读 · 0 评论 -
HDU 1219 AC Me(小技巧)
不要傻傻的用26个case或者if去做不要傻傻的用26个case或者if去做不要傻傻的用26个case或者if去做换个思路,开一个大小26的int数组,从第一个元素开始分别代表'a','b'.....'z'的个数ch[i]-'a'就是对应的元素,然后计数即可#include#includechar ch[100005];int main原创 2017-12-25 14:25:22 · 296 阅读 · 0 评论 -
HDU 1236 排名
用一个结构体,里面表示学号,做题数,题号,总分。先排好成绩,直接用一个结构体进行两个元素的交换即可注意!如果成绩相同,则按学号升序排列。继续排序,不过用strcmp函数比较学号即可#include#includestruct student{ char name[25]; int m; int number[15]; int sum;} St原创 2017-12-25 14:35:46 · 227 阅读 · 0 评论 -
HDU 1234 开门人和关门人
刚发现,做的这几道浙大复试上机题我都是用结构体完成的用结构体做的,或许有其他更好的方法开始:小时不同时谁小谁最早,小时相同比较分钟,分钟相同比较秒.....结束:小时不同时谁大谁最晚,小时相同比较分钟,分钟相同比较秒.....#includestruct start { int h; int m; int s;};struct time {原创 2017-12-25 16:08:34 · 261 阅读 · 0 评论 -
HDU 1014 Uniform Generator
这么长的题目......就是判断两个数最大公约数是否为1......感觉只是在考格式控制符......%10d#includeint gcd(int x, int y) { return y?gcd(y,x%y):x;}int main(void){ int n, m; while (scanf("%d %d", &n, &m) != EO原创 2017-12-26 11:51:22 · 179 阅读 · 0 评论 -
HDU 2502 月之数
20位最多能表示的数字1048575,遍历长度为n的值,然后加上其二进制位即可#includeint length(int n) { int count = 0; while (n) { count++; n>>=1; } return count;}int onenum(int n) { int count = 0; while (n原创 2018-01-01 00:02:16 · 249 阅读 · 0 评论 -
HDU 1016 Prime Ring Problem(DFS)
环状的数组,故注意判断首围相加是否为素数一个用来存数,一个用来标记是否使用过该数n个数组成,就有n个素数对,这个是结束条件#includeint n;int num[25];int flag[25];int primer(int n) { int flag = 1; for (int i = 2; i < n / 2; i++) { if原创 2017-12-26 11:54:46 · 189 阅读 · 0 评论 -
HDU 4505 小Q系列故事——电梯里的爱情
hdu1008做了这题应该没啥问题这道题需要注意相同楼层都会下,所以排一个序后,后一项与前项比较,为正即上升,为负即为下降当然还有格式,两个数之间有空格,不要在最后一个数后面有多余的空格#includeint main(void){ int n, T, m, sum, temp, num[105]; scanf("%d", &T原创 2018-01-02 23:32:04 · 361 阅读 · 0 评论 -
HDU A + B Problem II(大数加法)
呃,先说说思路吧,大数相加肯定就不能用int,float,double,long....应该用char数组比较两个数组的长短,从尾部开始相加,大于10就减去10。有一个情况需要注意下,当数组长度相等时,首位元素大于10的处理我觉得其实还有一个问题需要考虑,前导0的问题,数组前面为无效0的时候,例如00006 + 05 = 11,而不是00011。虽然结果一样,但是格式上.....原创 2017-11-04 13:00:26 · 418 阅读 · 0 评论 -
HDU 2091 空心三角形(格式控制)
1.遇到'@'直接返回2.每一行最后没有空格3.从第二行开始每组中间有换行写得有点繁琐,还是没能充分利用各行列之间的关系。分成了三部分,第一行,中间,最后一行中间每行空格数量依次为1,3,5,7....2*i-1,然后输出字符换行#includeint main(void){ char ch; int n; int flag = 0;原创 2017-12-02 17:49:12 · 307 阅读 · 0 评论 -
HDU 2056 Rectangles(矩形相交判断)
两个问题1.精度问题用double不要用float。在hdu里面有一些题用float就wa,换成double就ac,注意精度2.矩形相交判断说个题外话,其实很多2D游戏的道具判断就是这样,例如超级玛丽遇到蘑菇就会变大,其实就是矩形相交触发的事件假定矩形是用一对点表达的(minx, miny) (maxx, maxy),那么两个矩形 rect1{原创 2017-11-20 20:58:18 · 293 阅读 · 0 评论 -
HDU 2553 N皇后问题(经典的回溯问题)
我的这个把注释去掉就可以输出满足时的棋盘。提前打表,不然会超时#include#includeint count;int n;int isExist(int i, int j, int (*Q)[11]) { int s, t; for (s = i, t = 0; t < n; t++) { if (Q[s][t] && t != j) return 0原创 2017-11-06 21:28:54 · 208 阅读 · 0 评论 -
HDU 2052 Picture(玩点不一样的)
水题,只是为大家提供另一种玩法既然是输出图形嘛,平面图形,自然可以用二维数组表示。四个顶点为+,第一列和最后一列是|,第一行和最后一行为-,其他的为' '。先全部置为空,然后将四个顶点,第一行最后一行,第一列和最后一列分别赋值,最后输出即可。可能没有学c艹的同学不知道memset函数的用法,作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的原创 2017-10-21 20:27:14 · 330 阅读 · 0 评论 -
HDU 2503 a/b + c/d(一个优美的辗转相除法)
这个题我想说说辗转相除法代码美如画!!!int gcd(int x, int y){ return y ? gcd(y, x%y) : x;}代码如下#includeint gcd(int x, int y){ return y ? gcd(y, x%y) : x;}int main(void){ int T, a, b,原创 2017-11-08 22:49:06 · 288 阅读 · 0 评论 -
HDU 1412 {A} + {B}
第一次把c数组开小了,忽略了当n,m等于10000时需要一个比较大的数组思路是将两个数组元素复制到另一个数组,然后进行排序,将重复的元素用一个数组记录下来,然后进行遍历,一旦重复就跳过。输出即可注意输出的格式#include#includevoid sort(int * num, int n){ int temp; for (int i = 0;原创 2017-11-09 00:32:15 · 303 阅读 · 0 评论 -
HDU 2037 今年暑假不AC(贪心)
局部最优达到整体最优先把结束时间进行升序排序,开始时间也要保持和原来对应开始计数应该从1开始,比较时应该是小于等于下一个开始时间就加上#includeint main(void){ int n, a[105], b[105], i, j, temp, count; while (scanf("%d", &n) != EOF && n) { cou原创 2017-11-09 23:12:40 · 339 阅读 · 0 评论 -
HDU 2041 超级楼梯
2000系列有些类似的递推,推导出递推式就很好求解这道题本质上是斐波那契数列#includeint main(void){ int n, a, b, num[45]; scanf("%d", &n); while (n--) { scanf("%d", &a); num[2] = 1, num[3] = 2;原创 2017-11-01 16:21:49 · 356 阅读 · 0 评论 -
HDU 1282 回文数猜想
不用单独把回文写成一个函数,只用写置反的函数,置反之后的结果是否与原来相同即可判断回文数,格式控制的需要注意下#include#includeint reverse(int num) { int a, sum = 0; while (num > 0) { a = num % 10; sum = sum * 10 + a;原创 2017-11-12 10:19:08 · 590 阅读 · 0 评论 -
HDU 2565 放大的X(格式控制)
不要用数组,一旦你开始用数组,这题你基本上就错了,很多人一来就用数组,然后全部用置为' ',这在后面的输出就很有可能引起格式错误#includeint main(void){ int n, T; scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i原创 2017-11-12 10:51:55 · 745 阅读 · 0 评论 -
HDU 2053 Switch Game(简洁一点)
#includeint main(void){ int n, j; while (scanf("%d", &n) != EOF) { j = 0; for (int i = 1; i <= n; i++) { if (n%i == 0) { j = !j; } } printf("%d\n", j);原创 2017-11-04 10:39:16 · 212 阅读 · 0 评论 -
HDU 1201 18岁生日
#includeint judge(int n_year){ return ((n_year % 4 == 0) && (n_year % 100 != 0)) || (n_year % 400 == 0)?1:0;}int main(void){ int T, year, mouth, day, sum, count; scanf("%d", &T);原创 2017-11-14 15:56:27 · 284 阅读 · 0 评论 -
HDU 2045 不容易系列之(3)—— LELE的RPG难题(最简洁代码没有之一,数学大法好)
有些题其实有很多种方法,利用数学往往有奇效,并且极为简洁,高效这个题就是中学的环形涂色问题,是有公式的最简形式如下#include#includeint main(void){ int n; while (scanf("%d", &n) != EOF) { printf("%0.f\n", n==1?3:(原创 2017-11-19 13:07:17 · 280 阅读 · 0 评论 -
HDU 1215 七夕节
打表大法好!!!#includeint num[500005];void AC(void){ int i, j; for (i = 1; i < 500005 / 2; i++) { for (j = i*2; j < 500005; j += i) { num[j] += i; } }}int main(void){ int T, n;原创 2017-11-14 17:25:38 · 210 阅读 · 0 评论 -
HDU 1042 N! (大数阶乘加优化处理)
数组下标由低到高依次存放个,十,百.....然后从最后找出第一个非0元输出即可逢10进1,每次i与数组中每一项进项相乘,这是初步算法代码如下。 #include#include#define MAX 50000int main(void){ int num[MAX], n, temp; while (scanf("%d", &n) != EO原创 2017-11-05 21:34:34 · 369 阅读 · 0 评论 -
HDU 2050 折线分割平面(根据直线递推)
分析直线分平面最多多少份:f(1)=2;f(2)=4;f(3)=7;f(4)=11得到递推式f(n)=f(n-1)+n即f(n)=(1+n)*n/2+1;一条折线可看作两条直线,但是每条折线分割的区域比2条折线分割的区域少2,n条折线就少2n个区域折线递推式即为f(n) = (1+n)*n/2+1 - 2n = 2n^2 - n + 1原创 2017-11-19 22:07:27 · 384 阅读 · 0 评论 -
HDU 1228 A + B(来吧,互相伤害)
有点辣眼睛,还有两个部分也可以函数化,那样的化,代码还是可以少很多的。大致思路就是+号前和后两部分放到两个二维数组,然后转化为数值相加即可#include#includechar value[10][6]={"zero","one","two","three","four","five","six","seven","eight","nine"};char ch1[4][1原创 2017-12-29 18:02:13 · 239 阅读 · 0 评论