A.Make it White
标签:贪心+字符串
问题:有n个单元格的水平条段,分布着黑或者白(W:白,B:黑)。选择一段单元格,将其全部涂成白色,即黑变成白,白不变。为了将所有单元格全部变成白色,求需要涂成白色的最短长度
样例解释:WBBWBW,第一个B的下标为1,最后一个B的下标为4,所以最短长度为4-1+1=4
思路:找到第一个黑所在的下标i和最后一个黑所在的小标j,即可求出最短长度j-i+1
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--){
int n;cin>>n;
string s;cin>>s;
int idx1=0,idx2=0;
for(int i=0;i<n;i++){
if(s[i]=='B') {idx1=i;break;}
}
for(int i=n-1;i>=0;i--){
if(s[i]=='B') {idx2=i;break;}
}
cout<<idx2-idx1+1<<'\n';
}
return 0;
}
B.Following the String
标签:构造算法+贪心+字符串
问题:字符串s是n个数组成的数组a,其中是=的下标j(j<i)的个数。字符串s应该只由小写拉丁字母a-z组成,且输出的字符串s并非唯一
样例解释:abracadabra[0,0,0,1,0,2,0,3,1,1,1,4],数组是指对应的出现的次数,从0开始递增
思路:已知数组a,并自定义一个长度为26的数组b,for循环遍历查找,判断b[j]==a[i],符合的话加在字符串后面,且对应的b[j]++
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],n;
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--){
int b[26]={0};
cin>>n;
string s;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++){
for(int j=0;j<26;j++){
if(b[j]==a[i]){
char ch=j+'a';
s.append(1,ch);
b[j]++;
break;
}
}
}
cout<<s<<'\n';
}
return 0;
}