摘要: 题目链接:http://codeforces.com/problemset/problem/347/B题目意思:给出一个包含n个数的排列a,在排列a中最多只能作一次交换,使得ai = i 这样的匹配达到最多。作一次交换,最理想的情况是,在原来匹配好的序列中再匹配到两个数;最坏的情况是,即使作怎样的交换,都不可能再找到可以匹配的两个数,也就是说,根本不需要作交换。至于一般情况下,是可以再匹配到一个数的。 我是设了两个数组(分别有n个数):a(用来存储待判断的序列a)和b(依次存储0~n-1个数)。然后判断a[i]与b[i]是否相等,这是为了确定未作交换前两组序列本来能够匹配的数目;如果不符合就尝 阅读全文
posted @ 2013-09-21 09:19 windysai 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://codeforces.com/problemset/problem/344/B题目意思:这句话是解题的关键:The number of bonds of an atom in the molecule must be equal to its valence number。 给定三个原子的化学价,规定化学价数等于该原子与另外两个原子所连接的原子键之和。又一次把简单问题复杂化了.....(以下注释部分读者可以忽略) /* 一开始三重循环枚举,绝对超时(10^6 * 10^6 * 10^6),不敢提交!!后来甚至想到这三个原子构成的原子键与总的化学价数成两倍关系(貌似没什么 阅读全文
posted @ 2013-09-17 10:23 windysai 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://code.hdu.edu.cn/showproblem.php?pid=1879 这条题目我的做法与解决Constructing Roads的解法是相同的。 0 表示没有连通;1代表已连通。在已连通村庄的道路的基础上,找到扩展出来的最小生成树。 1 #include 2 #include 3 using namespace std; 4 5 const int maxe = 10000 + 10; 6 int rep[maxe], vis[maxe]; 7 8 struct sets 9 {10 int v1, v2;11 int value;1... 阅读全文
posted @ 2013-09-11 23:54 windysai 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2421实际上又是考最小生成树的内容,也是用到kruskal算法。但稍稍有点不同的是,给出一些已连接的边,要在这些边存在的情况下,拓展出最小生成树来。 一般来说,过到这四组数据大体上就能AC了。 1、题目给出的案例数据 2、连接的道路可能把所有的村庄都已经连通了 3、两个村庄给出多次,即连接这两个村庄的道路是重复的!。2、3这两种情况的数据如下(为了好看,自己出了一组,当然Sample Input 那组也行):情况2(所有村庄已连通): 情况3: 还有第4种情况: 1 #include 2 #include 3 using... 阅读全文
posted @ 2013-09-11 07:48 windysai 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3750 约瑟夫问题,直接模拟即可。 1 #include 2 #include 3 using namespace std; 4 5 const int maxn = 65; 6 7 int main() 8 { 9 char ch;10 int i, n, w, s, num[maxn];11 string per[maxn];12 while (scanf("%d", &n) != EOF)13 {14 for (i = 0; i > per[i]; // 保... 阅读全文
posted @ 2013-09-08 22:55 windysai 阅读(367) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://code.hdu.edu.cn/showproblem.php?pid=1233并查集的运用, 实质就是求最小生成树。先对所有的村庄距离从小到大排序,然后判断村庄之间是否属于同一集合,不是则将距离相加。属于同一集合,说明村庄连成了环,就不符合树的定义了。这样扫描下来,就求得最小生成树了。 要特别注意的是,数组越界问题。这个得益于Dwylkz的指点。由于村庄最多假设为100,为了防止边数越界,数组应该开到100 * 100 (10000)左右。 1 #include 2 #include 3 using namespace std; 4 5 const int ma... 阅读全文
posted @ 2013-09-08 12:00 windysai 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://codeforces.com/problemset/problem/342/A题目意思:给出n个数,找出n/3个组且每组有3个数,这三个数必须要符合两个条件:1、a = s[4],否则对于类似1 3 4 的数据是过不了的!!!! 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int maxn = 99999 + 5; 8 int s[maxn]; 9 10 int main()11 {12 int n, i, flag, temp;13 ... 阅读全文
posted @ 2013-09-07 23:23 windysai 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 有关系(直接或间接均可)的人就坐在一张桌子,我们要统计的是最少需要的桌子数。并查集的入门题,什么优化都无用到就可以直接过。实质上就是统计总共有多少个不相交的集合。比较可恶的是,题目中 There will be a blank line between two cases 是骗人的!!! 1 #include 2 using namespace std; 3 4 const int maxn = 1000 + 5; 5 int p[maxn], rank[maxn]; 6 7 int ... 阅读全文
posted @ 2013-09-07 20:04 windysai 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=19&page=show_problem&problem=1645题意:题目实质要我们求的是使集合连成环的所有pairs数。可以把每个元素看成顶点,则构成一个简单化合物就在两个元素间连成一条边。当整个图存在环的时候,组成环的边对应的化合物是危险的,反之就是安全的。 这样,我们可以用一个并查集来维护图的连通分量集合,每次得到一个简单化合物(x, y)时就检查x和y是否在同一集合中。如果 阅读全文
posted @ 2013-09-05 09:26 windysai 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2524实质上就是算经过所有的连边后,共有多少个不相交的集合。 我采取的方法和解决1611 The suspects的方法是相同的。读者可以参考下。这里只讨论经过两次merge处理之后,怎样统计不相交集合的个数。先用sort将所有元素的祖... 阅读全文
posted @ 2013-09-03 23:25 windysai 阅读(209) 评论(0) 推荐(0) 编辑