本文主要是介绍搜狐[编程题]彩色宝石项链.有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
时间限制:1秒
空间限制:32768K
有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等。有一天国王把项链赏赐给了一个学者,并跟他说,你可以带走这条项链,但是王后很喜欢红宝石,蓝宝石,紫水晶,翡翠和钻石这五种,我要你从项链中截取连续的一小段还给我,这一段中必须包含所有的这五种宝石,剩下的部分你可以带走。如果无法找到则一个也无法带走。请帮助学者找出如何切分项链才能够拿到最多的宝石。
输入描述:
我们用每种字符代表一种宝石,A表示红宝石,B表示蓝宝石,C代表紫水晶,D代
表翡翠,E代表钻石,F代表玉石,G代表玻璃等等,我们用一个全部为大写字母的
字符序列表示项链的宝石序列,注意项链是首尾相接的。每行代表一种情况。
输出描述:
输出学者能够拿到的最多的宝石数量。每行一个
示例1
输入
ABCYDYE
ATTMBQECPD
输出
1
3
#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;
}
这篇关于搜狐[编程题]彩色宝石项链.有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!