总结两道题,这两道题我认为均有相同之处。
题意:
每三个字符串的每位相同或分别含有S或E或T,若每位都符合上述条件,即可把他们分作一类。
给出n和k,分别代表有n个字符串,每个字符串长k,问这堆字符串能分作多少类。
题解:
暴力,枚举出前两个字符串,第三个自然可以被推出来,用map去查有多少个,加进答案中即可。O(k*n*n)未超时。
代码:
https://codeforces.com/contest/1287/submission/69889823
题意:
给出一个x,问lcm(a,b)的值为x的最小的max(a,b)的a,b为多少。
题解:
暴力,枚举a,a的范围皆为根号x,因为超过根号x的a不可能再整除x了,枚举出a后,若能整除x则推出了b,只需要判断gcd(a,b)为一即可符合lcm(a,b)的值为x了,只要不断更新a和b的值,找到最大一个符合a和b的就是答案了。O(根号n*5*logn)
代码:
https://codeforces.com/contest/1285/submission/69937367
我之所以把这两到题放在一起写,是因为他们两个有共同之处,解法都一样,暴力枚举出某一项或两项,但这不是重点,重点是因为他们推出答案的状态是大致相同的,做题时不妨从答案出发,第一题答案是若三个字符串能分一类则答案加加,那么很容易能想到三重循环枚举,但是很明显超时,所以不妨想想如何缩减,两重循环枚举推出第三个字符串,时间复杂度就可以了。第二题也是如此,我们要找lcm(a,b)的值为x的最小的max(a,b)的a,b为多少,gcd(a,b)为一的且a*b=x的一定符合条件,也不妨枚举a,推出b,看gcd(a,b)是否为一即可。这样做的前提是因为他们的答案都是由少量的状态来确定的,所以不妨枚举状态来确定答案。