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; }