搜狐[编程题]彩色宝石项链.有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等

来源:互联网 发布:cf游戏数据异常怎么办 编辑:程序博客网 时间:2024/06/02 16:16

时间限制:1秒
空间限制:32768K

有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等。有一天国王把项链赏赐给了一个学者,并跟他说,你可以带走这条项链,但是王后很喜欢红宝石,蓝宝石,紫水晶,翡翠和钻石这五种,我要你从项链中截取连续的一小段还给我,这一段中必须包含所有的这五种宝石,剩下的部分你可以带走。如果无法找到则一个也无法带走。请帮助学者找出如何切分项链才能够拿到最多的宝石。
输入描述:

我们用每种字符代表一种宝石,A表示红宝石,B表示蓝宝石,C代表紫水晶,D代表翡翠,E代表钻石,F代表玉石,G代表玻璃等等,我们用一个全部为大写字母的字符序列表示项链的宝石序列,注意项链是首尾相接的。每行代表一种情况。

输出描述:

输出学者能够拿到的最多的宝石数量。每行一个

示例1
输入

ABCYDYEATTMBQECPD

输出

13
#include <iostream>#include <string>#include <map>int main(void){    std::string str;    while(std::cin >> str)    {        std::map<char,int> mp;        mp['A'] = 2;        mp['B'] = 3;        mp['C'] = 5;        mp['D'] = 7;        mp['E'] = 11;        for(int i=1; i<=21; ++i)            mp['E'+i] = 1;        int len = str.length();        int min = len;        for(int i=0; i< len; ++i)         {            //从第i开始到i-1截止(首尾循环),找到包含ABCDE的最短的段,            int result = 2310;            for(int j=i; j<2*len;)            {                if(result % mp[str[j%len]] == 0 )                    result = result / mp[str[j%len]];                j++;                //j++  假设i=2,j=13.那么这里包含14个长度                if(result == 1) //找到了这个段                {                    if(j - i < min)                        min = j-i;                    break;                }/*j是内圈的位置,注意j已经++了。此时如果j%len == i表示首尾循环了一圈了。假设i=5,那么刚刚j没自加之前,是j=4进行了比较,此时加加,第5个位置的数在最开始就比较了,因此这一圈已经循环完了。应该跑到i=6的位置重新下一个循环*/                if(j%len == i)                    break;            }        }        std::cout << len - min <<std::endl;    }    return 0;}