版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zlb872551601/article/details/77650795
有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等。有一天国王把项链赏赐给了一个学者,并跟他说,你可以带走这条项链,但是王后很喜欢红宝石,蓝宝石,紫水晶,翡翠和钻石这五种,我要你从项链中截取连续的一小段还给我,这一段中必须包含所有的这五种宝石,剩下的部分你可以带走。如果无法找到则一个也无法带走。请帮助学者找出如何切分项链才能够拿到最多的宝石。
输入描述:
我们用每种字符代表一种宝石,A表示红宝石,B表示蓝宝石,C代表紫水晶,D代表翡翠,E代表钻石,F代表玉石,G代表玻璃等等,我们用一个全部为大写字母的字符序列表示项链的宝石序列,注意项链是首尾相接的。每行代表一种情况。
输出描述:
输出学者能够拿到的最多的宝石数量。每行一个
输入例子1:
ABCYDYE ATTMBQECPD
输出例子1:
1 3
想到的方法比较暴力,以后有新方法再写
#include<iostream> #include <string> using namespace std; #include <algorithm> void rotate(string &str) { char temp = str[0]; for (int i = 0; i < str.size()-1; i++) { str[i] = str[i + 1]; } str[str.size() - 1] = temp; } int check(string& str) { for (int i = 5; i <= str.size() ; i++) { string str_temp = str.substr(0, i); bool flag1 = find(str_temp.begin(), str_temp.end(), 'A') != str_temp.end(); bool flag2 = find(str_temp.begin(), str_temp.end(), 'B') != str_temp.end(); bool flag3 = find(str_temp.begin(), str_temp.end(), 'C') != str_temp.end(); bool flag4 = find(str_temp.begin(), str_temp.end(), 'D') != str_temp.end(); bool flag5 = find(str_temp.begin(), str_temp.end(), 'E') != str_temp.end(); if (flag1&&flag2&&flag3&&flag4&&flag5) { return str.size()- i; } } } int solve(string str) { int step_min =0; for (int i = 0; i < str.size();i++) { rotate(str); int step=check(str); step_min = max(step_min, step); } return step_min; } int main() { string str; while (cin>>str) { int ans=solve(str); cout << ans << endl; } return 0; }