SRM539-div2-3-CaptureFish

来源:互联网 发布:美化你的声音 知乎 编辑:程序博客网 时间:2024/06/03 13:42
zz:http://www.strongczq.com/2012/04/srm539-div2-3-capturefish.html

题目原文:
http://community.topcoder.com/stat?c=problem_statement&pm=11848

题目大意:
     池塘中线上有N+1个浮标,两个浮标之间有一条鱼,总共N条。每条鱼都有标记'O','X'或'*'。现在要捕捞这些鱼,规定标记为'O'的鱼是必须捕捞的,标记为'X'的鱼是不能捕捞的,标记为'*'的鱼是可捕可不捕的。捕捞的方式为,使用一根绳子次依穿过各个浮标,绳子只能通过浮标与池塘中该线相交,每个浮标可以选择不穿或只穿一次,最终绳子形成一个闭环,闭环内部或者闭环外部的所有鱼都可以被捕捞上来。问符合条件的捕捞方案中,不同的绳子穿梭方式总数是奇数还是偶数。
     数据规模:N为[1,50]

思路:
     这道题的题目描述很吓人,看起来好像很复杂的样子。好在题目要求的是判断不同绳子穿梭方式的奇偶性,根据这一点可以大幅度简化问题。简化问题的关键在于发现一个重要的特点:对于任意一种可行的穿梭方式,如果绳子穿过的游标数大于等于3,那么该穿梭方式以池塘的中线作为对称轴的对称穿梭方式必然也是可行的,并且是与该穿梭方式不同的。所以一旦穿过的游标数大于等于3,那么穿梭方式都是成对出现的,对总方式数的奇偶性不会有影响。
     根据这个结论,我们只需要考虑绳子只穿梭了两次游标的情况(显然不可能是一次),这种情况下绳子的形状就是一个简单的圆形,两个游标之间的鱼都处于闭环内,之外的鱼都处于闭环外。由于鱼数的最大值只有50,所以可以暴力枚举所有可能的游标选择方案。每一种方案下,判断是否把标'O'的鱼完全置于环内或者环外。时间复杂度O(N^2)。

Java代码:
public class CaptureFish{       public int getParity(String fish)      {          int N = fish.length();          int oNum = 0, xNum = 0;             for (int i = 0; i < fish.length(); ++i){                if (fish.charAt(i) == 'O' ){                    oNum++;                } else if (fish.charAt(i) == 'X'){                    xNum++;                }            }             int res = 0;             for (int i = 0; i < N; ++i){                for (int j = i + 1; j <= N; ++j){                    int on = 0, xn = 0;                    for (int k = i; k < j; ++k){                        if (fish.charAt(k) == 'O' ){                            on++;                        } else if (fish.charAt(k) == 'X'){                            xn++;                        }                    }                    if (xn == 0 && on == oNum){                        res++;                    } else if (on == 0 && xn == xNum){                        res++;                    }                }            }             return res % 2;      }}



原创粉丝点击