搜狐[程式設計題]彩色寶石項鍊.有一條彩色寶石項鍊,是由很多種不同的寶石組成的,包括紅寶石,藍寶石,鑽石,翡翠,珍珠等
阿新 • • 發佈:2019-01-22
時間限制: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;
}