題目鏈接
題目大意:
給定要給字符串(L<=50000),找出其中有多少個9706,題目並不是一個排列組合題,因此不需要考慮太多。
- 挑出的數字’9’,’7’,’0’,’6’在原串中可以不連續,但是數字的先後順序不能改變
- 使用過的數字不能被再次使用
- 如’123901370997606’可以最多挑出2個’9706’,而’6079’則無法挑出任何一個’9706’。
題目思路:
直接遍歷,不斷維護9706這四個字符出現的次數,同時保證:
count[9]>=count[7]>=count[0]>=count[6] 即可,最後count[6]就是答案。
代碼:
#include <iostream>
#include <fstream>
#include <map>
using namespace std;
//fstream resource("/Users/bingoboy/Downloads/cases.txt");
int cnt;
string tmp;
int status[5];
char buf[50010];
int main(){
int T;
cin>>T;
while(T--){
scanf("%s",buf);
int cnt[4]={0},ans=0;
for(int i=0;buf[i];i++){
switch(buf[i]){
case '9':{
cnt[0]++;
break;
}
case '7':{
if(cnt[1]+1<=cnt[0]) cnt[1]++;
break;
}
case '0':{
if(cnt[2]+1<= cnt[1]) cnt[2]++;
break;
}
case '6':{
if(cnt[3]+1<=cnt[2])cnt[3]++;
break;
}
default:
break;
}
}
cout<<cnt[3]<<endl;
}
return 0;
}
/*
int main() {
cin >> cnt;
while (cnt --) {
status[0] = status[1] = status[2] = status[3] = status[4] = 0;
cin >> tmp;
for (int i = 0; i < tmp.size(); ++ i) {
switch (tmp[i]) {
case '9':
status[0] += 1;
break;
case '7':
if (status[0] > 0) {
status[0] -= 1;
status[1] += 1;
}
break;
case '0':
if (status[1] > 0) {
status[1] -= 1;
status[2] += 1;
}
break;
case '6':
if (status[2] > 0) {
status[2] -= 1;
status[3] += 1;
}
default:
break;
}
}
cout << status[3] << endl;
}
return 0;
}
*/
掃碼關注作者,定期分享技術、算法類文章