列表

详情


SH5. 彩色宝石项链

描述

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

输入描述

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

输出描述

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

示例1

输入:

ABCYDYE
ATTMBQECPD

输出:

1
3

原站题解

C++ 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2017-11-06

#include <iostream>
#include <string>

using namespace std;

int arr[5];

bool check()
{
	return arr[0] && arr[1] && arr[2] && arr[3] && arr[4];
}

int min_cmp(int a, int b)
{
	if(a == -1){
		return b;
	}
	return a < b ? a : b;
}

int main()
{
	int i,j,min;
	string str;
	cin >> str;
	str = str + str;
	min = -1;
	i=0, j=0;
	while(true){
		while(!check() && j<str.length()){
			if(str[j] < 'F'){
				arr[str[j]-'A']++;
			}
			++j;
		}
		if(j==str.length() && !check()){
			break;
		}
		while(check()){
			if(str[i] < 'F'){
				arr[str[i]-'A']--;
			}
			i++;
		}
		min = min_cmp(min, j-i+1);
	}
	cout << str.length()/2 - min;
	return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2017-09-02

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char str[1000];
int get (int p,int lth);
int main()
{
	int i,length,temp;
	while(scanf("%s",str)!=EOF)
	{
		int take=0;
		length=strlen(str);
		for(i=0;i<length;i++)
		{
			if(str[i]>='A'&&str[i]<='E')
			{
				temp=get(i,length);
				if(temp>take)
					take=temp;
			}
			else
				continue;

		}
		printf("%d\n",take);

	}
	return 0;
}
int get(int p,int lth)
{
	int num[6]={0};
	int j,sum,gain,flag=0;
	num[str[p]-'A']=1;
	for(j=p+1;j<=lth;j++)
	{
		if(j==lth)
		{
			j=-1;
			flag=1;
			continue;
		}
		else if(str[j]>='A'&&str[j]<='E')
			num[str[j]-'A']=1;
		sum=num[0]+num[1]+num[2]+num[3]+num[4];
		if(sum==5)
			break;
	}
	if(j==lth-1)
		gain=0;
	else if(flag==1)
		gain=p-j-1;
	else
		gain=lth-(j-p+1);
	return gain;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-10-06

#include <iostream>
#include <string.h>
using namespace std;
int main(){
    string str;
    int len, minJ, bitSeq, dist;
    while(cin >> str){
        len = str.size();
        minJ = len;
        str += str;
        for(int i = 0; i < len; ++i){
            bitSeq = 0;
            for(int j = 0; j < len; ++j){
                dist = (str[i + j] - 'A');
                if(dist < 5){
                    bitSeq |= 1 << dist;
                    if (bitSeq == 31){
                        if(j < minJ)
                            minJ = j + 1;
                        break;
                    }
                }
            }
        }
        cout << len - minJ << endl;
    }
    
    return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-09-28

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<iostream>

using namespace std;
int get (int p,int len);
char str[1000];

int main()
{
    int i,length,temp;
    cin>>str;
   // while(cin>>str)
   //{
        int result=0;
        length=strlen(str);
        for(i=0;i<length;i++)
        {
            if(str[i]>='A'&&str[i]<='E')
            {
                temp=get(i,length);
                if(temp>result)
                    result=temp;
            }
            else
                continue;
 
        }
        cout<<result;
 
   // }
    return 0;
}
int get(int p,int len)
{
    int num[6]={0};
    int j,sum,gain,flag=0;
    num[str[p]-'A']=1;
    for(j=p+1;j<=len;j++)
    {
        if(j==len)
        {
            j=-1;
            flag=1;
            continue;
        }
        else if(str[j]>='A'&&str[j]<='E')
            num[str[j]-'A']=1;
        sum=num[0]+num[1]+num[2]+num[3]+num[4];
        if(sum==5)
            break;
    }
    if(j==len-1)
        gain=0;
    else if(flag==1)
        gain=p-j-1;
    else
        gain=len-(j-p+1);
    return gain;
}



C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-09-27

#include<iostream>
#include<string.h>
using namespace std;
int main(){
string s1;
cin>>s1;
string s2=s1+s1;
int sum = 0;
int minlength = 99999;
for(int i=0;i<s2.length();i++){
    for(int j=i;j<s2.length();j++){
	    if(s2[j]=='A'){
		sum=sum|1;
	    }
	    if(s2[j]=='B'){
		sum=sum|2;
	    }
	    if(s2[j]=='C'){
		sum=sum|4;
	    }
	    if(s2[j]=='D'){
		sum=sum|8;
	    }
	    if(s2[j]=='E'){
		sum=sum|16;
	    }
	    if(sum==31) {
	    	if((j-i+1)<minlength){
	    		minlength=j-i+1;      
			}
			 sum = 0;
			 break;
		}
    } 

}
cout<<s1.length()-minlength;
} 

上一题