CDU集训代码:基础算法和数据结构
2012-08-11 21:28
507 查看
做题地址:http://acm.hdu.edu.cn/diy/contest_login.php?cid=16600
Problem A :HDU1172
Problem B: HDU1051
题义:给定若干(1<= n <=5000)组二维坐标点,凡是满足 "x1<= x2 && y1<= y2"的话那么我们承认这两个坐标是属于同一个集合中。题目要我们求出这些坐标点最少能表示成几个集合。
For example, if you have five sticks whose pairs of length and weight are (4,9), (5,2), (2,1), (3,5), and (1,4), then the minimum setup time should be 2 minutes since there is a sequence of pairs (1,4), (3,5), (4,9), (2,1), (5,2).
先将所有的点的信息保存起来,然后选取 x 或者 y 作为对象进行排序,排序中注意如果两个点的 x相同,那么这时候要保持 y有序。这样做的目的是使得所有集合线性的呈现出来,可以理解为经过这样一次排序后,能够每次从前到后找到一个包含点满足题义且最多的点集。不会出现正确分离出来的集合在该排列中有元素是逆序的。
代码如下:
Problem C: HDU 1005
Problem A :HDU1172
//枚举 #include <stdio.h> int check1(int num1, int num2, int t) { int a[4], b[4]; int c[4]; int i, j; for(i=0; i<4; i++) { a[i] = num1%10; num1 /= 10; b[i] = num2%10; num2 /= 10; c[i] = 0; } int m = 0; for(i=0; i<4; i++) { for(j=0; j<4; j++) if(c[j]==0 && a[i]==b[j]) { m ++; c[j] = 1; break; } } if(m == t) return 1; else return 0; } int check2(int num1, int num2, int t) { int a[4], b[4]; int i; int m = 0; for(i=0; i<4; i++) { a[i] = num1%10; num1 /= 10; b[i] = num2%10; num2 /= 10; if(a[i] == b[i]) m++; } if(m == t) return 1; else return 0; } int main() { int a[101], b[101], c[101]; int cnt, res; int n,i,j; while(scanf("%d",&n),n) //输入N,且N不为0 { //存入数组 for(i=0; i<n; i++) scanf("%d%d%d", &a[i], &b[i], &c[i]); cnt = 0; //遍历所有4位数,每一个拿去试 for(i=1000; i<=9999; i++) { //试每种猜测的情况 for(j=0; j<n; j++) { if(check1(i, a[j], b[j]) == 0) break; if(check2(i, a[j], c[j]) == 0) break; } if(j >= n) { cnt ++; res = i; } if(cnt >= 2) break; } if(cnt==0 || cnt>=2) puts("Not sure"); else printf("%d\n", res); } return 0; }
Problem B: HDU1051
题义:给定若干(1<= n <=5000)组二维坐标点,凡是满足 "x1<= x2 && y1<= y2"的话那么我们承认这两个坐标是属于同一个集合中。题目要我们求出这些坐标点最少能表示成几个集合。
For example, if you have five sticks whose pairs of length and weight are (4,9), (5,2), (2,1), (3,5), and (1,4), then the minimum setup time should be 2 minutes since there is a sequence of pairs (1,4), (3,5), (4,9), (2,1), (5,2).
先将所有的点的信息保存起来,然后选取 x 或者 y 作为对象进行排序,排序中注意如果两个点的 x相同,那么这时候要保持 y有序。这样做的目的是使得所有集合线性的呈现出来,可以理解为经过这样一次排序后,能够每次从前到后找到一个包含点满足题义且最多的点集。不会出现正确分离出来的集合在该排列中有元素是逆序的。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int T; struct E { int len, wi; } e[5010]; char hash[5010]; int cmp(const void *a, const void *b) { if(((struct E *)a)-> len!= ((struct E *)b)-> len) { return ((struct E *)a)-> len- ((struct E *)b)-> len; } else { return ((struct E *)a)-> wi- ((struct E *)b)-> wi; } } int find(int N) { int i; for(i=0; i< N; ++i) { if(!hash[i]) { return i; } } return -1; } int ok(int i, int baselen, int basewi) { if(e[i].wi>= basewi) { return 1; } else { return 0; } } int main() { scanf("%d", &T); while(T--) { memset(hash, 0, sizeof(hash)); int N, time= 0, i; scanf("%d", &N); for(i= 0; i< N; ++i) { scanf("%d %d", &e[i].len, &e[i].wi); } qsort(e, N, sizeof(e[0]), cmp); int sta; while(1) { sta = find(N); if(sta== -1) { break; } int baselen= e[sta].len, basewi= e[sta].wi; for(i= sta; i< N; ++i) { if(!hash[i]&& ok(i, baselen, basewi)) { hash[i]= 1; baselen= e[i].len; basewi= e[i].wi; } } ++time; } printf("%d\n", time); } return 0; }
Problem C: HDU 1005
//递推 找规律 #include <stdio.h> #include <string.h> int main() { int a, b, n; int s[50]; while(scanf("%d%d%d", &a, &b, &n), a || b || n) { int i; s[0] = s[1] = 1; for(i = 2; i<50;i++) { s[i] = (a*s[i-1]+b*s[i-2]) % 7; if(s[i] ==1 && s[i-1] == 1) { break; } } n = n%(i-1); if(n == 0) printf("%d\n", s[i-2]); else printf("%d\n", s[n-1]); } return 0; }
相关文章推荐
- CDU集训代码:基础算法和数据结构2
- 10个经典的C语言面试基础算法及代码
- 数据结构C语言实现之链式队列的6种算法代码
- JAVA代码—算法基础:整数拆分求最大乘积问题
- 二叉树的几个基础遍历算法代码
- 数据结构和算法——链表代码2
- 一步一步复习数据结构和算法基础-线性表
- 经典面试题(一)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 线索二叉树代码实现 - 数据结构和算法49
- 基于粒子滤波器的目标跟踪算法基础(Rob Hess代码详细解析)第一部分
- KMP算法之NEXT数组代码原理分析 - 数据结构和算法38
- CDU集训代码:初等数论
- 技术面试宝典: 很全面的算法和数据结构知识(含代码实现)
- 程序员代码面试指南 IT名企算法与数据结构题目最优解.pdf
- 严蔚敏版数据结构课本代码——算法2.7
- 一步一步复习数据结构和算法基础-顺序串
- JAVA代码—算法基础:找出一维数组中重复次数最多的元素以及重复的次数
- 数据结构和算法 (二)数据结构基础之树、二叉树
- 10个经典的C语言面试基础算法及代码
- JAVA代码—算法基础:找出整形数组中只出现过1次的两个元素